import os
import base64
import random
import time
from datetime import datetime 
from django.db.models import F, Q
from planetstack.config import Config
from ec2_observer.syncstep import SyncStep
from core.models.user import User
from core.models.site import *
from ec2_observer.awslib import *
from ec2_observer.creds import *
import pdb

class SyncUsers(SyncStep):
    provides=[User]
    requested_interval=0

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

        users = User.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
        
        keys = []
        creds = []
        for u in users:
            e = get_creds(user=u, site=u.site)
            key_sig = aws_run('ec2 describe-key-pairs', env=e)
            ec2_keys = key_sig['KeyPairs']
            creds.append(e)
            keys.append(ec2_keys)
        else:
            ec2_keys = []

        for user,ec2_keys,e in zip(users,keys,creds):
            if (user.public_key): 
                key_name = user.email.lower().replace('@', 'AT').replace('.', '')
                key_found = False

                for key in ec2_keys:
                    if (key['KeyName']==key_name):
                        key_found = True
                        break

                if (not key_found):
                    aws_run('ec2 import-key-pair --key-name %s --public-key-material "%s"'%(key_name, user.public_key),env=e)
                    
        return users

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