import json
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.permissions import IsAuthenticated
from payrollservice.data.request.payrollmasterrequest import PaycomponentFlagmasterRequest
from payrollservice.data.request.payrolltemplaterequest import PayrollTemplateRequest
from payrollservice.data.response.payrollmasterresponse import PaycomponentFlagmasterResponse
from payrollservice.service.paycomponentsegmentmappingservice import PayrollSegementMappingService
from payrollservice.service.payrollmastermappingservice import PayrollmastermappingService
from payrollservice.service.payrollmastersservice import PaycomponentFlagmasterService, CompanyContributionService, \
    EmployeePFService
from payrollservice.service.payrolltemplateservice import PayrollTemplateService
from payrollservice.util.payrollutil import FlagRef_Type, master_validation, PayrollValidation
from utilityservice.data.response.nwisefinlist import NWisefinList
from utilityservice.data.response.nwisefinpage import NWisefinPage
# from utilityservice.service.nwisefinauthenticate import NWisefinAuthentication
from common_middleware.request_middleware import NWisefinAuthentication
from utilityservice.service.nwisefinpermission import NWisefinPermission
from rest_framework.decorators import api_view, authentication_classes, permission_classes

@csrf_exempt
@api_view(['POST', 'GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def create_payrolltemplate(request):
    scope = request.scope
    if request.method == 'POST':
        data_json = json.loads(request.body)
        validation_response = master_validation(data_json)
        if PayrollValidation.status == 'Success':
            req_obj = PayrollTemplateRequest(data_json)
            user_id = request.employee_id
            payroll_serv = PayrollTemplateService(scope).create_payrolltemplate(req_obj, user_id)
            if payroll_serv.message != 'ALREADY EXISTS IN GRADE':
                flag_master_data = data_json['segment']
                for i in flag_master_data:
                    data_obj = PaycomponentFlagmasterRequest(i)
                    flag_service = PaycomponentFlagmasterService(scope).create_paycomponentflag(data_obj, user_id, FlagRef_Type.PAYROLLTEMPLATE, payroll_serv.id)
                    paysegmapping = PayrollSegementMappingService(scope).get_segment_and_paycomponent_id(i['ref_id'])
                    for j in paysegmapping:
                        template_creation = PayrollmastermappingService(scope).auto_create_mastermapping(payroll_serv.id, j.segment, j.paycomponent, j.segment_percentage, user_id)
            return HttpResponse(payroll_serv.get(), content_type='application/json')
        else:
            json_data = json.dumps(validation_response)
            return HttpResponse(json_data, content_type='application/json')

    elif request.method == 'GET':
        page = request.GET.get('page', 1)
        page = int(page)
        vys_page = NWisefinPage(page, 10)
        response = PayrollTemplateService(scope).payrolltemplate_summary(vys_page,request)
        return HttpResponse(response.get(), content_type='application/json')


@csrf_exempt
@api_view(['GET', 'DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def get_payrolltemplate_data(request, id):
    scope = request.scope
    if request.method == 'GET':
        payroll_serv = PayrollTemplateService(scope).get_payrolltemplate_data(id)
        return HttpResponse(payroll_serv.get(), content_type='application/json')
    elif request.method == 'DELETE':
        payroll_serv = PayrollTemplateService(scope).inactive_payrolltemplate(id)
        return HttpResponse(payroll_serv.get(), content_type='application/json')


@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def get_payrolltemplate_get(request, id):
    scope = request.scope
    if request.method == 'GET':
        payroll_serv = PayrollTemplateService(scope).get_payrolletemplate(id)
        arr = NWisefinList()
        if len(payroll_serv)>0:
            payroll_template = PayrollTemplateService(scope).get_payrolltemplate_data(payroll_serv[0].id)
            flag_master = PaycomponentFlagmasterService(scope).get_payrolltemplate_data(id)
            payroll_template.segment = flag_master
            arr.append(payroll_template)
            response = HttpResponse(arr.get(), content_type='application/json')
            return response
        else:
            pass


@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def grade_based_segment_data(request):
    scope = request.scope
    if request.method == 'GET':
        grade = request.GET.get('grade')
        payroll_serv = PayrollTemplateService(scope).grade_based_segment_data(grade)
        json_dta = json.dumps(payroll_serv, indent=4)
        response = HttpResponse(json_dta, content_type='application/json')
        return response

@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def grade_based_segment_data1(request):
    scope = request.scope
    if request.method == 'GET':
        grade = request.GET.get('grade')
        resp_obj = PaycomponentFlagmasterResponse()
        final_data_obj = {}
        cc_service = CompanyContributionService(scope).get_cc_paycom_details()
        emp_pf_service = EmployeePFService(scope).get_employeepfstruct_details()
        payroll_serv = PayrollTemplateService(scope).grade_based_segment_data1(grade)
        resp_obj.company_contribution = cc_service
        resp_obj.employee_contribution = emp_pf_service
        data1 = str(resp_obj.get())
        data = json.loads(data1)
        cc_data , emp_pf_data = [], []
        for contribution in data["company_contribution"]:
            contribution.pop("paycomponent", None)
            cc_data.append(contribution)
        for emp_pf in data["employee_contribution"]:
            emp_pf.pop("paycomponent", None)
            emp_pf_data.append(emp_pf)
        final_data_obj['company_contribution'] = cc_data
        final_data_obj['employee_contribution'] = emp_pf_data
        final_data_obj['segment_details'] = payroll_serv['segment_details']
        final_data = json.dumps(final_data_obj, indent=4)
        response = HttpResponse(final_data, content_type='application/json')
        return response


@csrf_exempt
@api_view(['DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def inactive_payrolltemplate_common(request, id):
    scope = request.scope
    if request.method == 'DELETE':
        payroll_serv = PayrollTemplateService(scope).inactive_payrolltemplate_common(id)
        return HttpResponse(payroll_serv.get(), content_type='application/json')