import re
import urllib
from HTMLParser import HTMLParser, HTMLParseError

from django.conf import settings
from django.core.management.base import BaseCommand, CommandError
from django.utils.timezone import now

from releng.models import Iso


class IsoListParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)

        self.hyperlinks = []

    def handle_starttag(self, tag, attrs):
        if tag != 'a':
            return

        for name, value in attrs:
            if name != "href":
                continue

            if value.endswith('/') and value != '../' and '/' not in value[:-1] and len(value[:-1]) > 0:
                self.hyperlinks.append(value[:-1])

    def parse(self, url):
        try:
            remote_file = urllib.urlopen(url)
            data = remote_file.read()
            remote_file.close()
            self.feed(data)
            self.close()
            return self.hyperlinks
        except HTMLParseError:
            raise CommandError('Couldn\'t parse "%s"' % url)

class Command(BaseCommand):
    help = 'Gets new ISOs from %s' % settings.ISO_LIST_URL

    def handle(self, *args, **options):
        parser = IsoListParser()
        isonames = Iso.objects.values_list('name', flat=True)
        active_isos = parser.parse(settings.ISO_LIST_URL)

        for iso in active_isos:
            # create any names that don't already exist
            if iso not in isonames:
                new = Iso(name=iso, active=True)
                new.save()
            # update those that do if they were marked inactive
            else:
                existing = Iso.objects.get(name=iso)
                if not existing.active:
                    existing.active = True
                    existing.removed = None
                    existing.save(update_fields=('active', 'removed'))
        # and then mark all other names as no longer active
        Iso.objects.filter(active=True).exclude(name__in=active_isos).update(
                active=False, removed=now())

# vim: set ts=4 sw=4 et:
