import json

import numpy as np
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.empadditionalallowancerequest import Employeeadditional_allowanceRequest
from payrollservice.service.empadditionalallowanceservice import Employeeadditional_allowanceService
from payrollservice.service.payrollmastersservice import ComponentTypeService
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


@csrf_exempt
@api_view(['POST','GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def employeeadditional_allowance_create(request):
    scope = request.scope
    addition_service = Employeeadditional_allowanceService(scope)
    if request.method == 'POST':
        data_json = json.loads(request.body)
        for employee_addition in data_json:
            if len(employee_addition) > 0:
                if employee_addition['active_date'] < employee_addition['end_date'] or employee_addition['active_date'] == employee_addition['end_date']:
                    addition_request = Employeeadditional_allowanceRequest(employee_addition)
                    user_id = request.employee_id
                    addition_serv=addition_service.employeeadditional_allowance_create(addition_request,user_id)
                    response = HttpResponse(addition_serv.get(), content_type='application/json')
                else:
                    response1 = json.dumps({'date_message': "select valid active_date and end_date"})
                    response = HttpResponse(response1, content_type="application/json")
            else:
                addition_serv = NWisefinList()
                response = HttpResponse(addition_serv.get(), content_type='application/json')
        return response

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


@csrf_exempt
@api_view(['GET', 'DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def employeeadditional_allowance_get(request, id):
    scope = request.scope
    addition_service = Employeeadditional_allowanceService(scope)
    if request.method == 'GET':
        addition_serv = addition_service.employeeadditional_allowance_get(id)
        return HttpResponse(addition_serv.get(), content_type='application/json')
    elif request.method == 'DELETE':
        addition_serv = addition_service.employeeadditional_allowance_inactive(id)
        return HttpResponse(addition_serv.get(), content_type='application/json')


# custom_deductupload
@csrf_exempt
@api_view(['POST','GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def custom_bulkupload(request):
    scope = request.scope
    if request.method == 'POST':
        user_id = request.employee_id
        files = request.FILES.get('file')
        check_extension = files.name.split(".")[1]
        if check_extension == "xlsx" or "XLSX":
            custom_df = pd.read_excel(files)
        else:
            custom_df = pd.read_csv(files)
        payroll_serv = Employeeadditional_allowanceService(scope).custom_deduct_upload(custom_df, user_id)
        response = HttpResponse(payroll_serv.get(), "application/json")
        return response
    elif request.method == 'GET':
        finaldf = ['Employee_Code', 'Active_Date', 'End_Date', 'Amount', 'COMPONENT_TYPE']
        data = ComponentTypeService(scope).fetch_category()
        df = pd.DataFrame(columns=finaldf)
        excel = 'application/vnd.ms-excel'
        format = HttpResponse(content_type=excel)
        writer = pd.ExcelWriter(format, engine='xlsxwriter')
        df.to_excel(writer, sheet_name='Sheet1', index=False)
        data.to_excel(writer, sheet_name='Sheet2', index=False)
        writer.close()
        filename = 'CUSTOM DEDUCTION TEMPLATE'
        format['Content-Disposition'] = 'attachment; filename="' + filename + '.xlsx"'
        return format