import os
import base64
from django.db.models import F, Q
from planetstack.config import Config
from ec2_observer.syncstep import SyncStep
from core.models.site import *
from ec2_observer.awslib import *
import pdb

class SyncSites(SyncStep):
    provides=[Site]
    requested_interval=3600

    def fetch_pending(self, deletion):
        if (deletion):
            return []

        deployment = Deployment.objects.filter(Q(name="Amazon EC2"))[0]
        current_site_deployments = SiteDeployment.objects.filter(Q(deployment=deployment))

        zone_ret = aws_run('ec2 describe-availability-zones')
        zones = zone_ret['AvailabilityZones']

        available_sites = [zone['ZoneName'] for zone in zones]
        site_names = [sd.site.name for sd in current_site_deployments]

        new_site_names = list(set(available_sites) - set(site_names))

        new_sites = []
        for s in new_site_names:
            site = Site(name=s,
                        login_base=s,
                        site_url="www.amazon.com",
                        enabled=True,
                        is_public=True,
                        abbreviated_name=s)
            new_sites.append(site)
        
        return new_sites

    def sync_record(self, site):
        site.save()

