from django.db import models
#from django.utils.translation import ugettext, ugettext_lazy as _
import datetime


class Region(models.Model):
    code = models.CharField(max_length=2)
    name = models.CharField(max_length=64)
    def __unicode__(self):
        return u'%s (%s)' % (self.code, self.name)

class Country(models.Model):
    code = models.CharField(max_length=2)
    name = models.CharField(max_length=64)

    class Meta:
        #verbose_name = _('country')
        #verbose_name_plural = _('countries')
        verbose_name = 'country'
        verbose_name_plural = 'countries'

    def __unicode__(self):
        return u'%s (%s)' % (self.code, self.name)


class Project(models.Model):
    # does a project need a contact?
    name = models.CharField(max_length=128, unique=True)
    def __unicode__(self):
        return self.name

class Contact(models.Model):
    name = models.CharField(max_length=128, blank=True)
    email = models.EmailField(max_length=128, blank=True)
    username = models.CharField(max_length = 64, unique=True)
    password = models.CharField(max_length = 64)
    #misc = models.CharField(max_length=128, blank=True)
    # just in case
    note = models.TextField(blank=True)
    def __unicode__(self):
        return self.name

class Operator(models.Model):
    name = models.CharField(max_length=256, unique=True)
    # validate URL?
    homepage = models.URLField('Homepage', max_length=128, verify_exists=False, blank=True)
    # validate URL?
    logo = models.URLField('URL to logo', max_length=128, verify_exists=False, blank=True)
    def __unicode__(self):
        return self.name

class Server(models.Model):
    identifier = models.CharField('identifier (typically, the hostname)', max_length=64, unique=True)

    project = models.ForeignKey(Project, verbose_name='project mirrored on this server')

    # where is it?
    region  = models.ForeignKey(Region)
    country = models.ForeignKey(Country)

    asn = models.SmallIntegerField(null=True, blank=True)
    prefix = models.IPAddressField(null=True, blank=True) # FIXME -> ip4r datatype
    lat = models.DecimalField(max_digits=6, decimal_places=3, null=True, blank=True)
    lng = models.DecimalField(max_digits=6, decimal_places=3, null=True, blank=True)

    # contact data
    operator = models.ForeignKey(Operator, verbose_name='operator / organisation')
    # relation falschrum??? hm...
    contacts = models.ManyToManyField(Contact, verbose_name='list of contacts')

    ### Darix' Kommentare!!
    ## enum oder Tabelle fuer countries

    bandwidth = models.SmallIntegerField('bandwidth in MBit/s', null=True, blank=True)
    ipv6 = models.BooleanField()
    lfs = models.BooleanField()

    country_only   = models.BooleanField()
    region_only    = models.BooleanField()
    other_countries= models.CharField(max_length = 256, blank = True)
    file_maxsize   = models.IntegerField(default = 0)

    stage_access = models.BooleanField()

    comment        = models.TextField(blank=True) # FIXME

    def __unicode__(self):
        return self.identifier

class Mirror(models.Model):
    project = models.ForeignKey(Project)
    date_created = models.DateTimeField(default=datetime.datetime.now)
    server  = models.ForeignKey(Server)
    files   = models.ManyToManyField('File', verbose_name = 'list of files', editable = False)

    http  = models.URLField('base URL (HTTP)', max_length = 128, verify_exists = False)
    #ftp   = models.URLField('base URL (FTP)', max_length = 128, verify_exists = False, blank = True)
    ftp   = models.CharField('base URL (FTP)', max_length = 128, blank = True)
    rsync = models.CharField('base URL (rsync)', max_length = 128, blank = True)

    # better put this into a separate table:
    enabled   = models.BooleanField()
    http_head = models.BooleanField(default = False)

    prio      = models.IntegerField(default = 100)

    last_scan = models.DateTimeField(null = True, blank = True)
    scan_fpm  = models.IntegerField(null = True, blank = True)
    #scan_excludes
    far_away  = models.BooleanField()

    #push_sync

    def __unicode__(self):
        return u'%s @ %s' % (self.project, self.server)

class File(models.Model):
    path = models.CharField(max_length = 512, unique = True)
    checked = models.BooleanField()
    def __unicode__(self):
        return self.path

class Marker(models.Model):
    subtree_name = models.CharField(max_length=128)
    markers = models.CharField('subtree identifier(s) (one or more filenames)', max_length=512)
    def __unicode__(self):
        return self.subtree_name



