from django.core.management.base import BaseCommand
from datacenterlight.tasks import handle_metadata_and_emails
from opennebula_api.models import OpenNebulaManager
from membership.models import CustomUser
import logging
import json

logger = logging.getLogger(__name__)


class Command(BaseCommand):
    help = '''Updates the DB after manual creation of VM'''

    def add_arguments(self, parser):
        parser.add_argument('vm_id', type=int)
        parser.add_argument('order_id', type=int)
        parser.add_argument('user', type=str)
        parser.add_argument('specs', type=str)
        parser.add_argument('template', type=str)

    def handle(self, *args, **options):
        vm_id = options['vm_id']
        order_id = options['order_id']
        user_str = options['user']
        specs_str = options['specs']
        template_str = options['template']

        json_acceptable_string = user_str.replace("'", "\"")
        user_dict = json.loads(json_acceptable_string)

        json_acceptable_string = specs_str.replace("'", "\"")
        specs = json.loads(json_acceptable_string)

        json_acceptable_string = template_str.replace("'", "\"")
        template = json.loads(json_acceptable_string)
        if vm_id <= 0:
            self.stdout.write(self.style.ERROR(
                'vm_id can\'t be less than or 0. Given: %s' % vm_id))
            return
        if vm_id <= 0:
            self.stdout.write(self.style.ERROR(
                'order_id can\'t be less than or 0. Given: %s' % vm_id))
            return
        if specs_str is None or specs_str == "":
            self.stdout.write(
                self.style.ERROR('specs can\'t be empty or None'))
            return

        user = {
            'name': user_dict['name'],
            'email': user_dict['email'],
            'username': user_dict['username'],
            'pass': user_dict['pass'],
            'request_scheme': user_dict['request_scheme'],
            'request_host': user_dict['request_host'],
            'language': user_dict['language'],
        }
        cu = CustomUser.objects.get(username=user.get('username'))
        # Create OpenNebulaManager
        self.stdout.write(
            self.style.SUCCESS(
                'Connecting using %s' % (cu.username)
            )
        )
        manager = OpenNebulaManager(email=cu.username, password=cu.password)
        handle_metadata_and_emails(order_id, vm_id, manager, user, specs,
                                   template)
        self.stdout.write(
            self.style.SUCCESS(
                'Done handling metadata and emails for %s %s %s' % (
                    order_id,
                    vm_id,
                    str(user)
                )
           )
        )