import json
import sys
import traceback

from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view, permission_classes, authentication_classes
from rest_framework.permissions import IsAuthenticated
from payrollservice.data.request.emppaystructuredeductionsrequest import EmployeePaystructure_deductionsRequest
from payrollservice.service.emppaystructdeductionservice import EmployeePaystructure_deductionsService
from utilityservice.data.response.empmessage import ErrorMessage
from utilityservice.data.response.nwisefinerror import NWisefinError
from utilityservice.data.response.nwisefinlist import NWisefinList
# 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_employeepay_structdeduct(request):
    scope = request.scope
    paystruct_deduct = EmployeePaystructure_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:
            deduct_obj = EmployeePaystructure_deductionsRequest(paydetail)
            resp = paystruct_deduct.create_employeepay_structdeduct(deduct_obj,user_id,employee_id)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response
    elif request.method == 'GET':
        try :
            emp_id = request.GET.get('employee_id')
            payroll_serv = paystruct_deduct.employee_fetch(emp_id)
            arr = NWisefinList()
            if len(payroll_serv) > 0:
                apifunction = Payrollcommon_Apicall(scope)
                emp_data = apifunction.emp_details_payroll(emp_id)
                if not emp_data:
                    return HttpResponse('{"error": "invalid employee"}', content_type="application/json")
                # emp_data = empmonth_service.employee_details(emp_id)
                resp = paystruct_deduct.employeepaystruct_deduct(emp_id)
                emp_data['deducation_data'] = resp
                arr.append(emp_data)
            response = HttpResponse(arr.get(), content_type="application/json")
        except Exception as excep:
            exception_type, exception_object, exception_traceback = sys.exc_info()
            filename = exception_traceback.tb_frame.f_code.co_filename
            line_number = exception_traceback.tb_lineno
            traceback.print_exc()
            error_obj = NWisefinError()
            error_obj.set_code(ErrorMessage.INVALID_DATA)
            error_obj.set_description(str(excep))
            error_obj.error = {"error": (str(excep) + " - " + str(filename) + ", line_no: " + str(line_number))}
            response = HttpResponse(error_obj.get(), content_type="application/json")
        return response


@csrf_exempt
@api_view(['GET','DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def fetch_emppaystrcut_deduct(request, id):
    scope=request.scope
    paystruct_deduct = EmployeePaystructure_deductionsService(scope)
    if request.method == 'GET':
        resp=paystruct_deduct.fetch_emppaystruct_deduct(id)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response

    elif request.method == 'DELETE':
        user_id = request.employee_id
        resp=paystruct_deduct.inactive_emppaystruct_deduct(id, user_id)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response


@csrf_exempt
@api_view(['GET','DELETE'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def employee_satu_calc(request):
    scope = request.scope
    if request.method == 'GET':
        emp_id = request.GET.get('employee_id')
        paystruct_service = EmployeePaystructure_deductionsService(scope).Amount_calculation(emp_id)