from django.contrib.gis.db import models
from django.conf import settings
from datetime import datetime
import re

#  http://code.djangoproject.com/browser/django/trunk/django/contrib/gis/db/backend/postgis/models.py
from django.contrib.gis.db.backend.postgis.models import SpatialRefSys
from epsg.models import EpsgCoordinatereferencesystem

REF_TYPE_CHOICES = (
    ('ESRI', "ESRI"),
    ("ORACLE9", "Oracle 9i"),
    ("ORACLE10", "Oracle 10g"),
    ("ORACLE11", "Oracle 11g"),
    ("EPSG", "EPSG"),
    ("SRORG", "spatialreference.org")
    
)
class Base(models.Model):


    wkt = models.TextField() 
    type = models.CharField(max_length=12, choices=REF_TYPE_CHOICES)
    bounds = models.PolygonField(srid=4326, null=True)
    
    class Meta:
        abstract = True



class SRS(Base):
    title = models.TextField(blank=True,null=True)
    description = models.TextField()
    
    # for EPSG values, we'll override and fetch this out of the tables
    pub_date = models.DateTimeField(default=datetime.now) 

    creator = models.CharField(max_length=255, default="Anonymous")
    views = models.IntegerField(default=0)

    def __unicode__(self):
        return "%s: %s" % (self.id, self.title)    
    
class EPSG(SRS):
    epsg_code = models.ForeignKey(EpsgCoordinatereferencesystem) 
    
    def get_pub_date(self):
        #pass for now
        pass
    pub_date = property(get_pub_date)
    
class User(models.Model):
    title = models.CharField(max_length=200)
    
    from_esri = models.BooleanField()
    slug = models.CharField(max_length=200,editable=False)
    #geometry = models.PolygonField(srid=4326)

    def __unicode__(self):
        return "%s: %s" % (self.id, self.title)
        
    def get_absolute_url(self):
        return "/ref/user/%s/" % (self.id)

    def add_count(self):
        self.views += 1
        self.save()
        
    def gen_slug(self):
        value = re.sub('[^\w\s-]', '', self.title).strip().lower()
        value = re.sub('[-\s]+', '-', value)
        exists = UserReference.objects.filter(slug=value).count()
        if not exists: return value
        slug = 1
        while exists:
            slug += 1
            exists = UserReference.objects.filter(slug="%s-%s" % (value, slug)).count()
        return "%s-%s" % (value, slug)

    class Meta:
        db_table = 'references_reference'

    def save(self, force_insert=False, force_update=False):
        if not self.slug:
            self.slug = self.gen_slug()   
        super(UserReference, self).save()

class SpatialRefAttribute(models.Model):
    """
    from django.contrib.gis.db.backend.postgis.models import SpatialRefSys
    proj = SpatialRefSys.objects.get(srid=2805)
    proj.spatialrefattribute_set.get()
    
    from references.models import SpatialRefAttribute
    proj2 = SpatialRefAttribute.objects.get(ref=2805)
    
    proj == proj2.ref
    True
    
    """
    srid = models.ForeignKey(SpatialRefSys)
    epsg = models.ForeignKey(EpsgCoordinatereferencesystem) 
    views = models.IntegerField(default=0)
    title = models.CharField(max_length=255,blank=True,null=True)
    last_changed = models.DateTimeField(auto_now=True,null=True)
    
    def __unicode__(self):
        if self.title:
            return "SRS: %s (%s)" % (self.title, self.srid)
        return "SRS: %s" % self.srid
 
    def get_absolute_url(self):
        return "/ref/epsg/%s/" % (self.srid.srid)
              
    def auth_name(self):
        return self.srid.auth_name
    
    def auth_srid(self):
        return self.srid.auth_srid
    
    def srtext(self):
        return self.srid.srtext
    
    def proj4text(self):
        return self.srid.proj4text

    def add_count(self):
        self.views += 1
        self.save()
    
    def save(self, force_insert=False, force_update=False):
        # Populate the title if needed using OGR
        if not self.title:
            from osgeo import osr
            r = osr.SpatialReference()
            r.ImportFromEPSG(self.srid.pk)
            title = r.GetAttrValue("PROJCS")
            title = r.GetAttrValue("GEOGCS")
            self.title = title        
        super(SpatialRefAttribute, self).save()

    class Meta:
        db_table = 'spatial_ref_sys_attributes'
