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.empadvancedetailsrequest import EmployeeadvancedetailsRequest
from payrollservice.service.empadvancedetailsservice import EmployeeadvancedetailsService
from payrollservice.service.emppaystructureservice import EmployeePaystructureService
from payrollservice.service.payrolltranservice import PayrolltranService
from payrollservice.util.payrollutil import Advancestatus
from utilityservice.data.response.nwisefinerror import NWisefinError
from utilityservice.data.response.nwisefinerrorconstants import ErrorMessage, ErrorDescription
from utilityservice.data.response.nwisefinpage import NWisefinPage
from utilityservice.data.response.nwisefinsuccess import NWisefinSuccess
# 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 employeeadvance_create(request):
    scope = request.scope
    if request.method == 'POST':
        data_json = json.loads(request.body)
        req_obj = EmployeeadvancedetailsRequest(data_json)
        payroll_serv = EmployeeadvancedetailsService(scope).employeeadvance_create(req_obj)
        return HttpResponse(payroll_serv.get(), content_type='application/json')

    elif request.method == 'GET':
        page = request.GET.get('page', 1)
        page = int(page)
        vys_page = NWisefinPage(page, 10)
        user_id = request.employee_id
        admin = request.GET.get('admin')
        payroll_serv = EmployeeadvancedetailsService(scope).employeeadvance_summary(request,vys_page,user_id,admin)
        return HttpResponse(payroll_serv.get(), content_type='application/json')


# employeeadvancedetails get and delete
@csrf_exempt
@api_view(['GET', 'DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def employeeadvance_get(request, id_val):
    scope = request.scope
    if request.method == 'GET':
        payroll_serv = EmployeeadvancedetailsService(scope).employeeadvance_get(id_val)
        return HttpResponse(payroll_serv.get(), content_type='application/json')
    elif request.method == 'DELETE':
        payroll_serv = EmployeeadvancedetailsService(scope).employee_advance_inactive(id_val)
        return HttpResponse(payroll_serv.get(), content_type='application/json')


# employeeadvancedetails and Payrolltran
# @csrf_exempt
# @api_view(['POST', 'GET'])
# @authentication_classes([NWisefinAuthentication])
# @permission_classes([IsAuthenticated, NWisefinPermission])
# def create_employeeadvance_payrolltran(request):
#     scope = request.scope
#     if request.method == 'POST':
#         import datetime
#         error_obj = NWisefinError()
#         data_json = json.loads(request.body)
#         user_id = request.employee_id
#         pay_struct = EmployeePaystructureService(scope).employee_level_get(user_id)
#         if pay_struct.count() > 0:
#             takehome = pay_struct[0].take_home
#             cal_takehome = float(takehome * 3)
#             employee_request = EmployeeadvancedetailsRequest(data_json)
#             if cal_takehome > float(data_json['actual_amount']):
#                 if data_json['from_date'] < data_json['to_date']:
#                     from_date1 = datetime.datetime.strptime(data_json['from_date'], "%Y-%m")
#                     to_date1 = datetime.datetime.strptime(data_json['to_date'], "%Y-%m")
#                     year = from_date1.year
#                     year1 = to_date1.year
#                     month = from_date1.month
#                     month1 = to_date1.month
#                     from_date = datetime.date(year, month, 1)
#                     to_date = datetime.date(year1, month1, 1)
#                     user_id = request.employee_id
#                     empmonth_service = EmployeeadvancedetailsService(scope)
#                     resp_obj = empmonth_service.create_employeedetails(employee_request, user_id, from_date, to_date)
#                     # ref_type =FlagRef_Type.Employeeadvancedetails
#                     # if resp_obj.id > 0:
#                     #     tran_obj = PayrolltranRequest(data_json)
#                     #     data_obj = PayrolltranService(scope).create_payrolltran(tran_obj, user_id, resp_obj, ref_type)
#                     response = HttpResponse(resp_obj.get(), content_type="application/json")
#                 else:
#                     error_obj.set_message(ErrorMessage.ERROR)
#                     error_obj.set_description('select valid from_date and to_date')
#                     response = HttpResponse(error_obj.get(), content_type="application/json")
#             else:
#                 error_obj.set_message(ErrorMessage.ERROR)
#                 error_obj.set_description('amount limit Exceed')
#                 response = HttpResponse(error_obj.get(), content_type="application/json")
#         else:
#             error_obj.set_message(ErrorMessage.ERROR)
#             error_obj.set_description('Kindly Activate Your Payroll')
#             response = HttpResponse(error_obj.get(), content_type="application/json")
#         return response
#         # else:
#         #     data = "NO DATA or INVALID DATA"
#         #     return data
#
#     elif request.method == 'GET':
#         page = request.GET.get('page', 1)
#         page = int(page)
#         vys_page = NWisefinPage(page, 10)
#         payroll_serv = EmployeeadvancedetailsService(scope).employeeadvance_details_summary(vys_page)
#         return HttpResponse(payroll_serv.get(), content_type='application/json')


@csrf_exempt
@api_view(['GET', 'DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def employeeadvancedetails_get(request, id_val):
    scope = request.scope
    if request.method == 'GET':
        payroll_serv = EmployeeadvancedetailsService(scope).employeeadvance_details_get(id_val)
        return HttpResponse(payroll_serv.get(), content_type='application/json')
    elif request.method == 'DELETE':
        payroll_serv = EmployeeadvancedetailsService(scope).employee_advance_inactive(id_val)
        return HttpResponse(payroll_serv.get(), content_type='application/json')

@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def employee_payroll_admin(request):
    if request.method == 'GET':
        scope = request.scope
        employeename = request.GET.get('employeename')
        find_role_id = request.GET.get('find_role_id')
        find_role = request.GET.get('find_role')
        user_id = request.employee_id
        resp_obj = Payrollcommon_Apicall(scope).employee_payroll_admin(find_role_id,find_role,employeename,user_id)
        response = HttpResponse(resp_obj.get(), content_type="application/json")
        return response

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



@csrf_exempt
@api_view(['POST', 'GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def create_employeeadvance_payrolltran(request):
    scope = request.scope
    if request.method == 'POST':
        import datetime
        error_obj = NWisefinError()
        data_json = json.loads(request.body)
        user_id = request.employee_id
        if data_json['advance_status'] == Advancestatus.draft or (data_json['advance_status'] == Advancestatus.move_to_checker and data_json['advance_id'] == "" or data_json['advance_id'] == None or 'id' in data_json):
            pay_struct = EmployeePaystructureService(scope).employee_level_get(user_id)
            if pay_struct.count() > 0:
                takehome = pay_struct[0].take_home
                cal_takehome = float(takehome * 3)
                employee_request = EmployeeadvancedetailsRequest(data_json)
                if cal_takehome > float(data_json['actual_amount']):
                    if data_json['from_date'] < data_json['to_date'] or data_json['from_date'] == data_json['to_date']:
                        from_date1 = datetime.datetime.strptime(data_json['from_date'], "%Y-%m")
                        to_date1 = datetime.datetime.strptime(data_json['to_date'], "%Y-%m")
                        year = from_date1.year
                        year1 = to_date1.year
                        month = from_date1.month
                        month1 = to_date1.month
                        from_date = datetime.date(year, month, 1)
                        to_date = datetime.date(year1, month1, 1)
                        user_id = request.employee_id
                        empmonth_service = EmployeeadvancedetailsService(scope)
                        resp_obj = empmonth_service.create_employeedetails(employee_request, user_id, from_date, to_date)
                        # ref_type =FlagRef_Type.Employeeadvancedetails
                        # if resp_obj.id > 0:
                        #     tran_obj = PayrolltranRequest(data_json)
                        #     data_obj = PayrolltranService(scope).create_payrolltran(tran_obj, user_id, resp_obj, ref_type)
                        response = HttpResponse(resp_obj.get(), content_type="application/json")
                    else:
                        error_obj.set_message(ErrorMessage.ERROR)
                        error_obj.set_description('select valid from_date and to_date')
                        response = HttpResponse(error_obj.get(), content_type="application/json")
                else:
                    error_obj.set_message(ErrorMessage.ERROR)
                    error_obj.set_description('amount limit Exceed')
                    response = HttpResponse(error_obj.get(), content_type="application/json")
            else:
                error_obj.set_message(ErrorMessage.ERROR)
                error_obj.set_description('Kindly Activate Your Payroll')
                response = HttpResponse(error_obj.get(), content_type="application/json")
        elif data_json['advance_status'] != Advancestatus.draft:
            payroll_serv = PayrolltranService(scope).advance_approve_data(user_id, data_json)
            response= HttpResponse(payroll_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)
        payroll_serv = EmployeeadvancedetailsService(scope).employeeadvance_details_summary(vys_page)
        return HttpResponse(payroll_serv.get(), content_type='application/json')


@csrf_exempt
@api_view(['POST'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def update_advavancepaid(request):
    scope = request.scope
    user_id = request.employee_id
    action = request.GET.get('action', None)
    if request.method == 'POST':
        if action == None:
            struct_obj = json.loads(request.body)
            payroll_serv = EmployeeadvancedetailsService(scope).update_advancestatus(user_id, struct_obj)
            return HttpResponse(payroll_serv.get(), content_type='application/json')
        elif action == 'excel':
            excel_data = pd.read_excel(request.FILES['file'], engine='openpyxl', sheet_name=None)
            df1 = excel_data['Sheet1']
            df = pd.DataFrame(df1)
            struct_obj = df.fillna(np.nan).replace([np.nan], [None]).to_dict(orient='records')
            print(struct_obj)
            payroll_serv = EmployeeadvancedetailsService(scope).excel_update_advancestatus(user_id,struct_obj)
            return HttpResponse(payroll_serv.get(), content_type='application/json')


@csrf_exempt
@api_view(['POST', 'GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def advancesummary(request):
    scope = request.scope
    if request.method == 'POST':
        data_json = json.loads(request.body)
        user_id = request.employee_id
        resp_obj = EmployeeadvancedetailsService(scope).update_advanceforceclose(data_json, user_id)
        return HttpResponse(resp_obj.get(), content_type='application/json')
    elif request.method == 'GET':
        page = request.GET.get('page', 1)
        page = int(page)
        vys_page = NWisefinPage(page, 10)
        user_id = request.employee_id
        admin = request.GET.get('admin')
        payroll_serv = EmployeeadvancedetailsService(scope).advancesummary(request,user_id,admin,vys_page)
        return HttpResponse(payroll_serv.get(), content_type='application/json')



