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.report_request import Report_Request
from payrollservice.service.report_service import Report_Service
from payrollservice.util.payrollutil import master_validation, PayrollValidation, report_dropdown_, \
    reportcolumns_dropdown_, advancestatus_dropdown
from utilityservice.data.response.nwisefinpage import NWisefinPage
# from utilityservice.service.employee_api_service import Employeecommon_Apicall
# from utilityservice.service.nwisefinauthenticate import NWisefinAuthentication
from common_middleware.request_middleware import NWisefinAuthentication
from utilityservice.service.nwisefinpermission import NWisefinPermission
from hrmsmasterapiservice.hrmsmasterapi.masteranduserserviceapi import HrmsApiService

@csrf_exempt
@api_view(['POST','GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated,NWisefinPermission])
def create_report_column(request):
    scope = request.scope
    service = Report_Service(scope)
    if request.method == 'POST':
        emp_id = request.employee_id
        resp_data = json.loads(request.body)
        validation_response = master_validation(resp_data)
        if PayrollValidation.status == 'Success':
            report_column_request = Report_Request(resp_data)
            report_serv = service.create_reportcolumn(report_column_request,emp_id)
            response = HttpResponse(report_serv.get(), content_type='application/json')
            return response
        else:
            json_data = json.dumps(validation_response)
            return HttpResponse(json_data, content_type='application/json')
    elif request.method == 'GET':
        name = request.GET.get('name')
        page = request.GET.get('page', 1)
        page = int(page)
        vys_page = NWisefinPage(page, 10)
        resp = service.report_column_summary(name,vys_page)
        response = HttpResponse(resp.get(), content_type='application/json')
        return response

@csrf_exempt
@api_view(['GET', 'DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def get_report_column(request, rep_id):
    scope = request.scope
    serv = Report_Service(scope)
    if request.method == 'GET':
        resp = serv.get_report_column(rep_id)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response
    elif request.method == 'DELETE':
        resp = serv.delete_report_column(rep_id)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response

@csrf_exempt
@api_view(['POST','GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated,NWisefinPermission])
def create_report_template(request):
    scope = request.scope
    service = Report_Service(scope)
    if request.method == 'POST':
        emp_id = request.employee_id
        resp_data = json.loads(request.body)
        # validation_response = master_validation(resp_data)
        # if PayrollValidation.status == 'Success':
        report_template_request = Report_Request(resp_data)
        report_serv = service.create_ReportTemplate(report_template_request,emp_id,resp_data)
        response = HttpResponse(report_serv.get(), content_type='application/json')
        return response
        # else:
        #     json_data = json.dumps(validation_response)
        #     return HttpResponse(json_data, content_type='application/json')
    elif request.method == 'GET':
        name = request.GET.get('name', None)
        bank_id = request.GET.get('bank_id', None)
        page = request.GET.get('page', 1)
        page = int(page)
        vys_page = NWisefinPage(page, 10)
        report_serv = service.report_template_summary(bank_id,name,vys_page)
        response = HttpResponse(report_serv.get(), content_type='application/json')
        return response


@csrf_exempt
@api_view(['GET', 'DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def get_report_template(request, temp_id):
    scope = request.scope
    serv = Report_Service(scope)
    if request.method == 'GET':
        resp = serv.get_report_template(temp_id)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response
    elif request.method == 'DELETE':
        resp = serv.delete_report_template(temp_id)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response
@csrf_exempt
@api_view(['DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def delete_report_template(request, detail_id):
    scope = request.scope
    serv = Report_Service(scope)
    if request.method == 'DELETE':
        resp = serv.delete_details(detail_id)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response
# @csrf_exempt
# @api_view(['GET'])
# @authentication_classes([NWisefinAuthentication])
# @permission_classes([IsAuthenticated, NWisefinPermission])
# def get_report_details(request):
#     scope = request.scope
#     service = Report_Service(scope)
#     if request.method == 'GET':
#         page = request.GET.get('page', 1)
#         column_id = request.GET.get('column_id')
#         template_id = request.GET.get('template_id')
#         page = int(page)
#         vys_page = NWisefinPage(page, 10)
#         details_serv = service.report_details_summary(vys_page,column_id,template_id)
#         response = HttpResponse(details_serv.get(), content_type='application/json')
#         return response

@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def report_dropdown(request):
    if request.method == 'GET':
        resp = report_dropdown_()
        response = HttpResponse(resp.get(), content_type='application/json')
        return response


@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def report_banktemplate(request, template_id):
    scope = request.scope
    serv = Report_Service(scope)
    if request.method == 'GET':
        resp = serv.report_banktemplates(template_id)
        return resp


@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def payroll_bank_template(request, bank_id):
    scope = request.scope
    serv = Report_Service(scope)
    user_id = request.employee_id
    if request.method == 'GET':
        # bank_data = Employeecommon_Apicall(scope).fetch_bank_values([int(bank_id)])
        bank_data = HrmsApiService(scope).fetch_bank_values([int(bank_id)])
        filename = bank_data[0]['name']
        resp = serv.payroll_bank_template(request,bank_id,user_id,filename)

        if resp.empty:
            format = HttpResponse(content_type='application/vnd.ms-excel')
            format['Content-Disposition'] = f'attachment; filename="{str(filename) + ".xlsx"}"'
            writer = pd.ExcelWriter(format, engine='xlsxwriter')
            resp.to_excel(writer, sheet_name='Sheet1', index=False)
            try:
                writer.close()
            except:
                writer.save()
        else:
            format = HttpResponse(content_type='application/vnd.ms-excel')
            format['Content-Disposition'] = f'attachment; filename="{str(filename) + ".xlsx"}"'
            writer = pd.ExcelWriter(format, engine='xlsxwriter')
            resp.to_excel(writer, sheet_name='Sheet1', index=False)
            try:
                writer.close()
            except:
                writer.save()
        return format


@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def reportcolumns_dropdown(request):
    if request.method == 'GET':
        resp = reportcolumns_dropdown_()
        response = HttpResponse(resp.get(), content_type='application/json')
        return response


@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def get_linkcolumns(request):
    scope = request.scope
    if request.method == 'GET':
        resp = Report_Service(scope).get_linkcolumns(request)
        response = HttpResponse(resp, content_type='application/json')
        return response



@csrf_exempt
@api_view(['POST','GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def bank_linkcolumns_exceldownload(request, bank_id):
    scope = request.scope
    serv = Report_Service(scope)
    user_id = request.employee_id
    # if request.method == 'POST':
    #     excel_data = pd.read_excel(request.FILES['file'], engine='openpyxl', sheet_name=None)
    #     df1 = excel_data['Sheet1']
    #     df = pd.DataFrame(df1)
    #     df['PAID_DATE'] = pd.to_datetime(df['PAID_DATE'], errors='coerce')
    #     payroll_obj = df.fillna(np.nan).replace([np.nan], [None]).to_dict(orient='records')
    #     print(payroll_obj)
    #     payroll_serv = serv.excelupdate_payrollpaystatus(request,user_id, payroll_obj)
    #     return HttpResponse(payroll_serv.get(), content_type='application/json')
    if request.method == 'GET':
        # bank_data = Employeecommon_Apicall(scope).fetch_bank_values([int(bank_id)])
        bank_data = HrmsApiService(scope).fetch_bank_values([int(bank_id)])
        filename = bank_data[0]['name']
        resp = serv.bank_linkcolumns_exceldownload(request,bank_id,user_id,filename)
        if resp.empty:
            format = HttpResponse(content_type='application/vnd.ms-excel')
            format['Content-Disposition'] = f'attachment; filename="{str(filename) + ".xlsx"}"'
            writer = pd.ExcelWriter(format, engine='xlsxwriter')
            resp.to_excel(writer, sheet_name='Sheet1', index=False)
            writer.close()
        else:
            format = HttpResponse(content_type='application/vnd.ms-excel')
            format['Content-Disposition'] = f'attachment; filename="{str(filename) + ".xlsx"}"'
            writer = pd.ExcelWriter(format, engine='xlsxwriter')
            resp.to_excel(writer, sheet_name='Sheet1', index=False)
            writer.close()
        return format


@csrf_exempt
@api_view(['POST','GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def excelupdate_payrollpaystatus(request):
    scope = request.scope
    serv = Report_Service(scope)
    user_id = request.employee_id
    if request.method == 'POST':
        excel_data = pd.read_excel(request.FILES['file'], engine='openpyxl', sheet_name=None)
        df1 = excel_data['Sheet1']
        df = pd.DataFrame(df1)
        df['PAID_DATE'] = pd.to_datetime(df['PAID_DATE'], errors='coerce')
        payroll_obj = df.fillna(np.nan).replace([np.nan], [None]).to_dict(orient='records')
        print(payroll_obj)
        payroll_serv = serv.excelupdate_payrollpaystatus(request,user_id, payroll_obj)
        return HttpResponse(payroll_serv.get(), content_type='application/json')
    elif request.method == 'GET':
        finaldf = ['EMPLOYEE_CODE','PAY_STATUS','PAID_DATE','TRANSACTION_NUMBER','REMARKS']
        util_data = advancestatus_dropdown().get()
        json_data = json.loads(util_data)
        data = json_data['data']
        df2 = pd.DataFrame(data)
        df1= pd.DataFrame(columns=finaldf)
        excel = 'application/vnd.ms-excel'
        format = HttpResponse(content_type=excel)
        writer = pd.ExcelWriter(format, engine='xlsxwriter')
        df1.to_excel(writer, sheet_name='Sheet1', index=False)
        df2.to_excel(writer, sheet_name='Sheet2', index=False)
        writer.close()
        filename = 'PAY STRUCTURE TEMPLATE'
        format['Content-Disposition'] = 'attachment; filename="' + filename + '.xlsx"'
        return format