from django.db import models

from django.contrib.auth.models import User,Group
import time
import datetime

# Defined Choices
DOMAIN_TYPES = ( 
    ('MASTER', 'Local Domain'),
    ('SLAVE','Remote Domain'),
)

RECORD_TYPES = ( 
    ('A','A record - IPv4 address'),
    ('AAAA','AAAA record - IPv6 address'),
    ('CNAME','CNAME record - canonical name of a record'),
    ('HINFO','Hardware Info record'),
    ('MX','MX- mail exchanger host/domain record'),
    ('NAPTR','NAPTR - Naming Authority Pointer record'),
    ('NS','NS - Nameserver record'),
    ('PTR','PTR - Reverse pointer record'),
    ('RP','RP - Responsible Person record'),
    ('SOA','SOA - Start of Authority record'),
    ('SRV','SRV - service record'),
    ('TXT','TXT - text data record'),
)

class Domain (models.Model):
    name = models.CharField('Domain Name', maxlength=255, db_index=True, unique=True)
    type = models.CharField('Domain Type', maxlength=6, choices=DOMAIN_TYPES, editable=False, default='MASTER')
    master = models.CharField('Supermaster Address', maxlength=20, blank=True, editable=False)
    last_check = models.IntegerField('Timestamp of last check', null=True, editable=False)
    notified_serial = models.IntegerField('Serial of last notify', null=True, editable=False)
    account = models.CharField('Supermaster Account', maxlength=255, blank=True, editable=False, help_text='Which supermaster brought us this domain?')
#    primary = models.CharField('Primary Nameserver', maxlength=255)
#    hostmaster = models.CharField('Hostmaster adjress', default='hostmaster@$DOMAIN', maxlength=255, help_text='usually hostmaster@$DOMAIN')
#    serial = models.IntegerField('Serial', default=0, help_text='YYYYMMDDNN, if 0 pdns tries to figure it out by itself')
#    refresh = models.IntegerField('Refresh', default=10800, help_text='default 3 hours')
#    retry = models.IntegerField('Retry', default=3600, help_text='default 1 hour')
#    expire = models.IntegerField('Expire', default=604800, help_text='default 1 week')
#    default_ttl = models.IntegerField('Default TTL', default=3600, help_text='default 1 hour')

    def __unicode__(self):
        return self.name

    class Meta:
        db_table = 'domains'

    class Admin:
        list_display = ('name','type','master','last_check','notified_serial','account')
        list_filter = ('name','type','account')

class DomainRecord (models.Model):
    domain = models.ForeignKey(Domain, db_index=True, edit_inline=models.TABULAR, num_in_admin=5, num_extra_on_change=3)
    type = models.CharField('Record Type', maxlength=6, choices=RECORD_TYPES, default='A', db_index=True)
    name = models.CharField('name', maxlength=255, db_index=True, core=True, help_text='Only used for some record types, i.e. FQDN for an A record, domain basename for all the others')
    content = models.CharField('Record Data', maxlength=255, core=True)
    ttl = models.IntegerField('Time to Live', default=3600)
    prio = models.IntegerField('Priority (only MX)', null=True, blank=True)
    change_date = models.IntegerField('Timestamp of last Change', null=True, editable=False)

    def __unicode__(self):
        return self.name

    class Meta:
        db_table = 'domain_records'

    class Admin:
        list_display = ('domain','name','type','content','ttl','prio','change_date')
        list_filter = ('domain','type')

class TemplateRecord (models.Model):
    #template = models.ForeignKey(Template)
    type = models.CharField('Record Type', maxlength=6, choices=RECORD_TYPES, default='A')
    name = models.CharField('name', maxlength=255, db_index=True, default='$DOMAIN', help_text='Only used for some record types, i.e. FQDN for an A record, leave as $DOMAIN if not needed')
    content = models.CharField('Record Data', maxlength=255)
    ttl = models.IntegerField('Time to Live', default=3600)
    prio = models.IntegerField('Priority (only MX)', null=True, blank=True)
    change_date = models.IntegerField('Timestamp of last Change', null=True, editable=False)

    def uniquename(self):
      if (self.name != '$DOMAIN'):
        return self.name
      else:
        return ''
    
    def __unicode__(self):
        return "%s:%s %s" % (self.type, self.uniquename(), self.content)

    class Meta:
        db_table = 'template_records'

    class Admin:
        list_display = ('name','type','content','ttl','prio','change_date')
        list_filter = ('type',)

    def save(self):
        now = str(datetime.datetime.now())
        today = now[0:4] + now[5:7] + now[8:10]
        counter = '00'
        oldserial = str(self.change_date)
        if (today == oldserial[0:8]):
            counter = oldserial[8:10]
            counter = str(eval(counter) + 1)
            if (len(counter) == 1):
                counter = '0' + counter
        serial = today + counter
        self.change_date = eval(serial)
        super(TemplateRecord, self).save();

class Template (models.Model):
    name = models.CharField('Template Name', maxlength=255)
    created_by = models.ForeignKey(User)
    records = models.ManyToManyField(TemplateRecord,filter_interface=models.HORIZONTAL)

    def __unicode__(self):
        return self.name

    class Meta:
        db_table = 'templates'

    class Admin:
        list_display = ('name','created_by')

class TemplateDomain (models.Model):
    template = models.ForeignKey(Template, core=True)
    domain = models.ForeignKey(Domain, db_index=True, edit_inline=models.TABULAR, num_in_admin=1, num_extra_on_change=1, related_name='Templates')
    change_date = models.IntegerField('Timestamp of last Change', null=True, editable=False)

    class Meta:
        db_table = 'template_domains'

    def save(self):
        now = str(datetime.datetime.now())
        today = now[0:4] + now[5:7] + now[8:10]
        counter = '00'
        oldserial = str(self.change_date)
        if (today == oldserial[0:8]):
            counter = oldserial[8:10]
            counter = str(eval(counter) + 1)
            if (len(counter) == 1):
                counter = '0' + counter
        serial = today + counter
        self.change_date = eval(serial)
        super(TemplateDomain, self).save();

class Supermaster (models.Model):
    ip = models.IPAddressField('IP Address of Supermaster', maxlength=255, help_text='The numerical address of the supermaster', unique=True)
    nameserver = models.CharField('our FQDN there', maxlength=255, help_text='The FQDN under which the supermaster knows us', unique=True)
    user = models.ForeignKey(User)
    change_date = models.IntegerField('Timestamp of last change', null=True, editable=False)
    account = models.CharField('Supermaster Account', maxlength=255, help_text='The account of the supermaster here', blank=True)

    def __unicode__(self):
        return self.ip

    class Meta:
        db_table = 'supermasters'

    class Admin:
        list_display = ('ip','nameserver','user','change_date')
        list_filter = ('user','account')


