import json
import pandas as pd
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view, authentication_classes, permission_classes
from rest_framework.permissions import IsAuthenticated
from payrollservice.data.request.empmonthlypaydeductionrequest import Employeemonthlypay_deductionsRequest
from payrollservice.service.empmonthlypaydeductionservice import Employeemonthlypay_deductionsService
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 utilityservice.service.payroll_api_service import Payrollcommon_Apicall


@csrf_exempt
@api_view(['POST', 'GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def create_employeemonth_deduct(request):
    scope = request.scope
    empmonth_deduct = Employeemonthlypay_deductionsService(scope)
    if request.method == 'POST':
        data_json = json.loads(request.body)
        user_id = request.employee_id
        paystruct_detail = data_json.get("deduction_data")
        employee_id = data_json.get("emp_id")
        for paydetail in paystruct_detail:
            if len(paydetail) > 0:
                deduct_obj = Employeemonthlypay_deductionsRequest(paydetail)
                resp = empmonth_deduct.create_employeemonth_deduct(deduct_obj, user_id, employee_id)
            else:
                resp = NWisefinList()
        response = HttpResponse(resp.get(), content_type="application/json")
        return response
    elif request.method == 'GET':
        emp_id = request.GET.get('employee_id')
        month = request.GET.get('month')
        year = request.GET.get('year')
        payroll_serv = empmonth_deduct.get_employeemonth(emp_id)
        arr = NWisefinList()
        if len(payroll_serv) > 0:
            apifunction = Payrollcommon_Apicall(scope)
            emp_data = apifunction.emp_details_payroll(emp_id)
            resp = empmonth_deduct.employeemonthpay_deduct(emp_id, month, year)
            emp_data.deducation_data = resp
            arr.append(emp_data)
        response = HttpResponse(arr.get(), content_type="application/json")
        return response


@csrf_exempt
@api_view(['GET', 'DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def fetch_employeemonth_deduct(request, id):
    scope = request.scope
    empmonth_deduct = Employeemonthlypay_deductionsService(scope)
    if request.method == 'GET':
        resp=empmonth_deduct.fetch_employeemonth_deduct(id)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response
    elif request.method == 'DELETE':
        user_id = request.employee_id
        resp=empmonth_deduct.inactive_employeemonth_deduct(id, user_id)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response


@csrf_exempt
@api_view(['POST'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def excel_uplode_of_employeemonthlypay_deductions(request):
    scope = request.scope
    if request.method == 'POST':
        payroll_serv = Employeemonthlypay_deductionsService(scope)
        df = pd.read_excel(request.FILES['file'], engine='openpyxl')
        df.columns = ['EMPLOYEE_CODE', 'PAYCOMPONENT', 'DEDUCTION_STATUS', 'AMOUNT', 'TYPE', 'FROM_DATE', 'TO_DATE']
        data_obj = payroll_serv.excel_uplode(df)
        response = HttpResponse(data_obj.get(), 'application/json')
        return response


@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def deduction_summary(request):
    scope = request.scope
    if request.method == 'GET':
        page = request.GET.get('page', 1)
        page = int(page)
        vys_page = NWisefinPage(page, 10)
        payroll_serv = Employeemonthlypay_deductionsService(scope).deduction_summary(vys_page)
        response = HttpResponse(payroll_serv.get(), content_type='application/json')
        return response