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 SyncSiteDeployments(SyncStep):
	requested_interval=86400
	provides=[SiteDeployments]

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

		zone_ret = aws_run('ec2 describe-availability-zones')
		zones = zone_ret['AvailabilityZones']
		available_sites = [zone['ZoneName'] for zone in zones]

		current_sites = []
		for s in available_sites:
			site = Site.objects.filter(Q(name=s))
			if (site):
				current_sites.append(site[0])

		# OK not to catch exception
		# The syncstep should catch it
		# At any rate, we should not run if there are no deployments
		deployment = Deployment.objects.filter(Q(name="Amazon EC2"))[0]
		current_site_deployments = SiteDeployments.objects.filter(Q(deployment=deployment))
		site_dict = {}

		for sd in current_site_deployments:
			site_dict[sd.site]=sd

		updated_site_deployments = []
		for site in current_sites:
			try:
				site_record = site_dict[site]
			except KeyError:
				sd = SiteDeployments(site=site,deployment=deployment,tenant_id=base64.urlsafe_b64encode(os.urandom(12)))
				updated_site_deployments.append(sd)

		return updated_site_deployments


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