import urllib

from rest_framework import serializers

from .models import *


class StudentSerializer(serializers.ModelSerializer):
    resume_list = serializers.SerializerMethodField()
    offers = serializers.SerializerMethodField()

    def get_resume_list(self, obj):
        links = []
        for i in obj.resumes:
            ele = {}
            ele['link'] = LINK_TO_STORAGE_RESUME + urllib.parse.quote(obj.id + "/" + i)
            ele['name'] = i
            links.append(ele)
        return links

    def get_offers(self, obj):
        selected_companies = PlacementApplication.objects.filter(student_id=obj.id, selected=True)
        pre_placement_offers = PrePlacementOffer.objects.filter(student_id=obj.id)
        companies = []

        for i in selected_companies:
            ele = {}
            ele['designation'] = i.placement.designation
            ele['company_name'] = i.placement.company_name
            ele['application_id'] = i.id
            ele['placement_offer_type'] = 'Normal'
            companies.append(ele)
        for i in pre_placement_offers:
            ele = {}
            ele['designation'] = i.designation
            ele['company_name'] = i.company
            ele['application_id'] = i.id
            ele['placement_offer_type'] = 'PPO'
            companies.append(ele)

        return companies

    class Meta:
        model = Student
        exclude = ['resumes']


class PlacementSerializerForStudent(serializers.ModelSerializer):
    company_details_pdf_links = serializers.SerializerMethodField()
    description_pdf_links = serializers.SerializerMethodField()
    compensation_pdf_links = serializers.SerializerMethodField()
    selection_procedure_details_pdf_links = serializers.SerializerMethodField()

    def get_company_details_pdf_links(self, obj):
        links = []
        for pdf_name in obj.company_details_pdf_names:
            ele = {}
            link = LINK_TO_STORAGE_COMPANY_ATTACHMENT + urllib.parse.quote(obj.id + "/" + pdf_name)
            ele['link'] = link
            ele['name'] = pdf_name
            links.append(ele)
        return links

    def get_description_pdf_links(self, obj):
        links = []
        for pdf_name in obj.description_pdf_names:
            ele = {}
            link = LINK_TO_STORAGE_COMPANY_ATTACHMENT + urllib.parse.quote(obj.id + "/" + pdf_name)
            ele['link'] = link
            ele['name'] = pdf_name
            links.append(ele)
        return links

    def get_compensation_pdf_links(self, obj):
        links = []
        for pdf_name in obj.compensation_details_pdf_names:
            ele = {}
            link = LINK_TO_STORAGE_COMPANY_ATTACHMENT + urllib.parse.quote(obj.id + "/" + pdf_name)
            ele['link'] = link
            ele['name'] = pdf_name
            links.append(ele)
        return links

    def get_selection_procedure_details_pdf_links(self, obj):
        links = []
        for pdf_name in obj.selection_procedure_details_pdf_names:
            ele = {}
            link = LINK_TO_STORAGE_COMPANY_ATTACHMENT + urllib.parse.quote(obj.id + "/" + pdf_name)
            ele['link'] = link
            ele['name'] = pdf_name
            links.append(ele)
        return links

    class Meta:
        model = Placement
        exclude = [CONTACT_PERSON_NAME, PHONE_NUMBER, EMAIL, COMPANY_DETAILS_PDF_NAMES, DESCRIPTION_PDF_NAMES,
                   COMPENSATION_DETAILS_PDF_NAMES, SELECTION_PROCEDURE_DETAILS_PDF_NAMES, OFFER_ACCEPTED,
                   EMAIL_VERIFIED,
                   ]
        depth = 1


class PlacementSerializerForAdmin(serializers.ModelSerializer):
    company_details_pdf_links = serializers.SerializerMethodField()
    description_pdf_links = serializers.SerializerMethodField()
    compensation_pdf_links = serializers.SerializerMethodField()
    selection_procedure_details_pdf_links = serializers.SerializerMethodField()

    def get_company_details_pdf_links(self, obj):
        links = []
        for pdf_name in obj.company_details_pdf_names:
            ele = {}
            link = LINK_TO_STORAGE_COMPANY_ATTACHMENT + urllib.parse.quote(obj.id + "/" + pdf_name)
            ele['link'] = link
            ele['name'] = pdf_name
            links.append(ele)
        return links

    def get_description_pdf_links(self, obj):
        links = []
        for pdf_name in obj.description_pdf_names:
            ele = {}
            link = LINK_TO_STORAGE_COMPANY_ATTACHMENT + urllib.parse.quote(obj.id + "/" + pdf_name)
            ele['link'] = link
            ele['name'] = pdf_name
            links.append(ele)
        return links

    def get_compensation_pdf_links(self, obj):
        links = []
        for pdf_name in obj.compensation_details_pdf_names:
            ele = {}
            link = LINK_TO_STORAGE_COMPANY_ATTACHMENT + urllib.parse.quote(obj.id + "/" + pdf_name)
            ele['link'] = link
            ele['name'] = pdf_name
            links.append(ele)
        return links

    def get_selection_procedure_details_pdf_links(self, obj):
        links = []
        for pdf_name in obj.selection_procedure_details_pdf_names:
            ele = {}
            link = LINK_TO_STORAGE_COMPANY_ATTACHMENT + urllib.parse.quote(obj.id + "/" + pdf_name)
            ele['link'] = link
            ele['name'] = pdf_name
            links.append(ele)
        return links

    class Meta:
        model = Placement
        exclude = [COMPANY_DETAILS_PDF_NAMES, DESCRIPTION_PDF_NAMES,
                   COMPENSATION_DETAILS_PDF_NAMES, SELECTION_PROCEDURE_DETAILS_PDF_NAMES]
        depth = 1


class PlacementApplicationSerializer(serializers.ModelSerializer):
    placement = serializers.SerializerMethodField()
    resume_link = serializers.SerializerMethodField()

    def get_placement(self, obj):
        data = PlacementSerializerForStudent(obj.placement).data
        return data

    def get_resume_link(self, obj):
        ele = {'link': LINK_TO_STORAGE_RESUME + urllib.parse.quote(str(obj.student.roll_no) + "/" + obj.resume), 'name': obj.resume}
        return ele

    class Meta:
        model = PlacementApplication
        exclude = [STUDENT, 'resume']


class PlacementApplicationSerializerForAdmin(serializers.ModelSerializer):
    student_details = serializers.SerializerMethodField()
    resume_link = serializers.SerializerMethodField()

    def get_student_details(self, obj):
        data = StudentSerializer(obj.student).data
        return data

    def get_resume_link(self, obj):
        ele = {'link': LINK_TO_STORAGE_RESUME + urllib.parse.quote(obj.id + "/" + obj.resume), 'name': obj.resume}
        return ele

    class Meta:
        model = PlacementApplication
        exclude = ['placement', 'resume']