import json
from datetime import datetime

from django.utils.timezone import make_aware
from rest_framework.decorators import api_view

from .utils import *

logger = logging.getLogger('db')


@api_view(['POST'])
@precheck([DESIGNATION, DESCRIPTION, OPENING_TYPE, CITY, CITY_TYPE,
           COMPENSATION, COMPENSATION_DETAILS, ALLOWED_BATCH, ALLOWED_BRANCH,
           ROUNDS, CO_OP, START_DATE, ADDITIONAL_INFO,
           DURATION, ROUND_DETAILS])
def addOpening(request):
    try:
        data = request.data
        if data[OPENING_TYPE] == "Placement":
            opening = Placement()
        else:
            raise ValueError("Invalid Opening Type")

        opening.id = generateRandomString()
        # Create Company object here for every Opening


        #  Some new code above

        if data[DESIGNATION] != "":
            opening.designation = data[DESIGNATION]
        else:
            raise ValueError(DESIGNATION + " Not Found")

        opening.description = data[DESCRIPTION]

        if data[START_DATE] != "":
            opening.description = data[START_DATE]
        else:
            raise ValueError(START_DATE + " Not Found")
        if data[START_DATE] != "":
            opening.start_date = datetime.strptime(data[START_DATE], '%d-%m-%Y')
        else:
            raise ValueError(START_DATE + " Not Found")
        if data[CITY] != "":
            opening.city = data[CITY]
        else:
            raise ValueError(CITY + " Not Found")
        if data[CITY_TYPE] != "":
            opening.city_type = data[CITY_TYPE]
        else:
            raise ValueError(CITY_TYPE + " Not Found")
        if data[COMPENSATION] != "":
            opening.compensation = data[COMPENSATION]
        else:
            raise ValueError(COMPENSATION + " Not Found")

        opening.compensation_details = data[COMPENSATION_DETAILS]

        if data[ALLOWED_BATCH] != "":
            if set(json.loads(data[ALLOWED_BATCH])).issubset(BATCHES):
                opening.allowed_batch = json.loads(data[ALLOWED_BATCH])
            else:
                raise ValueError(ALLOWED_BATCH + " is Invalid")
        else:
            raise ValueError(ALLOWED_BATCH + " Not Found")
        if data[ALLOWED_BRANCH] != "":
            if set(json.loads(data[ALLOWED_BRANCH])).issubset(BRANCHES):
                opening.allowed_branch = json.loads(data[ALLOWED_BRANCH])
            else:
                raise ValueError(ALLOWED_BATCH + " is Invalid")
        else:
            raise ValueError(ALLOWED_BRANCH + " Not Found")

        opening.rounds = json.loads(data[ROUNDS])

        opening.additional_info = json.loads(data[ADDITIONAL_INFO])

        opening.status = STATUS_ACCEPTING_APPLICATIONS

        opening.rounds_details = json.loads(data[ROUND_DETAILS])

        opening.created_at = make_aware(datetime.now())
        files = request.FILES.getlist(ATTACHMENTS)
        attachments = []
        for file in files:
            attachments.append(saveFile(file, STORAGE_DESTINATION_COMPANY_ATTACHMENTS))

        opening.attachments = attachments
        opening.save()
        data = {
            "designation": opening.designation,
            "opening_type": data[OPENING_TYPE],
            "opening_link": "google.com",           # Some Changes here too
            "company_name": opening.company.name
        }

        # Needs some edits here

        email = 'This is temporary'

        # Delete the above var when done

        stat = sendEmail(email, COMPANY_OPENING_SUBMITTED_TEMPLATE_SUBJECT.format(id=opening.id), data,
                         COMPANY_OPENING_SUBMITTED_TEMPLATE)
        if stat is not True:
            logger.warning("Add New Opening: Unable to send email - " + stat)

        return Response({'action': "Add Opening", 'message': "Opening Added"},
                        status=status.HTTP_200_OK)

    except ValueError as e:
        return Response({'action': "Add Opening", 'message': str(e)},
                        status=status.HTTP_400_BAD_REQUEST)
    except:
        logger.warning("Add New Opening: " + str(sys.exc_info()))
        return Response({'action': "Add Opening", 'message': "Error Occurred {0}".format(
            str(sys.exc_info()[1]))},
                        status=status.HTTP_400_BAD_REQUEST)