from datetime import datetime

import numpy as np
import pandas as pd
from django.template import loader
from xhtml2pdf import pisa

from django.views.decorators.csrf import csrf_exempt
from rest_framework.decorators import api_view, authentication_classes, permission_classes

# from masterservice.service.designationservice import DesignationService
from hrmsmasterapiservice.hrmsmasterapi.masteranduserserviceapi import HrmsApiService
from npayroll.settings import logger
from payrollservice.data.request.emppaystructuredeductionsrequest import EmployeePaystructure_deductionsRequest
from payrollservice.data.request.emppaystructuredetailsrequest import EmployeePaystructure_detailsRequest
from payrollservice.data.request.emppaystructurerequest import EmployeePaystructureRequest
from payrollservice.service.empmonthlypaydetailsservice import Employeemonthlypay_detailsService
from payrollservice.service.emppaystructdeductionservice import EmployeePaystructure_deductionsService
from payrollservice.service.emppaystructuredetailsservice import EmployeePaystructure_detailsService
from payrollservice.service.paycomponentsegmentmappingservice import PayrollSegementMappingService
from payrollservice.service.payrollmastermappingservice import PayrollmastermappingService
from payrollservice.service.payrollmastersservice import PayrollComponentService
from payrollservice.util.payrollutil import paymode_dropdown, advancestatus_dropdown
# from userservice.data.request.employeerequest import EmployeeRequest
from payrollservice.data.request.employeerequest import EmployeeRequest
from utilityservice.data.response.nwisefinerror import NWisefinError
from utilityservice.data.response.nwisefinerrorconstants import ErrorMessage, ErrorDescription
from utilityservice.data.response.nwisefinlist import NWisefinList
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 rest_framework.permissions import IsAuthenticated
from utilityservice.data.response.nwisefinpage import NWisefinPage
from django.http import HttpResponse
from payrollservice.service.emppaystructureservice import EmployeePaystructureService
import json
from payrollservice.service.emppaystructdeductionservice import EmployeePaystructure_deductionsService
from utilityservice.service.payroll_api_service import Payrollcommon_Apicall
from reportlab.pdfgen import canvas
from reportlab.lib.units import inch, cm
# from PyPDF2 import PdfFileWriter, PdfFileReader
from reportlab.lib.colors import HexColor
from PyPDF2 import PdfReader, PdfWriter
import io


@csrf_exempt
@api_view(['POST','GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated,NWisefinPermission])
def create_emp_pay(request):
    scope = request.scope
    if request.method == 'POST':
        data_json = json.loads(request.body)
        action = request.GET.get('action', None)
        id = request.GET.get('id', None)
        employee_request = EmployeePaystructureRequest(data_json)
        user_id = request.employee_id
        paystruct_service = EmployeePaystructureService(scope)
        paystruct_detail = data_json.get("employeepay_detail")
        if action == '1':
            for paydetail in paystruct_detail:
                detail_obj = EmployeePaystructure_detailsRequest(paydetail)
                data_obj = EmployeePaystructure_detailsService(scope).create_employeepay_structdetails(request, detail_obj, user_id, id, employee_request.standard_ctc, employee_request.gross_pay, action)
                response = HttpResponse(data_obj.get(), content_type="application/json")
            return response
        else:
            resp_obj = paystruct_service.create_employeepay_struct(request, employee_request, user_id)
            if resp_obj.message != 'ALREADY EXISTS IN EMPLOYEE CODE':
                data = resp_obj.id
                standard_ctc = resp_obj.standard_ctc
                gross_pay = resp_obj.gross_pay
                for paydetail in paystruct_detail:
                    detail_obj = EmployeePaystructure_detailsRequest(paydetail)
                    data_obj = EmployeePaystructure_detailsService(scope).create_employeepay_structdetails(request, detail_obj, user_id,data,standard_ctc,gross_pay, action)
                response = HttpResponse(resp_obj.get(), content_type="application/json")
            else:
                response = HttpResponse(resp_obj.get(), content_type="application/json")
            return response
    else:
        page = request.GET.get('page', 1)
        page = int(page)
        vys_page = NWisefinPage(page, 10)
        payroll_service = EmployeePaystructureService(scope)
        resp = payroll_service.employeepay_summary(vys_page)
        response = HttpResponse(resp.get(), content_type="application/json")
        return response


@csrf_exempt
@api_view(['POST', 'GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def employee_pay_create(request):
    scope = request.scope
    if request.method == 'POST':
        data_json = json.loads(request.body)
        user_id = request.employee_id
        employee_req = EmployeeRequest(data_json)
        emp_id = request.GET.get('employee_id')
        employeepay_serv = EmployeePaystructureService(scope).create_emp_payroll(employee_req,user_id,emp_id)
        response = HttpResponse(employeepay_serv.get(),content_type='application/json')
        return response


@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def employee_level_detection(request):
    scope = request.scope
    if request.method == 'GET':
        emp_id = request.GET.get('employee_id')
        action = request.GET.get('action')
        if action in ('1','2'):
            if action == '1':
                payroll_serv = EmployeePaystructureService(scope).employee_level_get(emp_id)
                arr = NWisefinList()
                if len(payroll_serv) > 0:
                    employee_pay = EmployeePaystructureService(scope).employee_pay_get(payroll_serv[0].id)
                    employee_details = EmployeePaystructure_detailsService(scope).employee_level_detail(payroll_serv[0].id)
                    employee_deduct = EmployeePaystructure_deductionsService(scope).employeepaystruct_deduct(emp_id)
                    monthly_takehome = float(employee_details[0].total_component_amount) + float(employee_details[0].total_bonus) - float(employee_deduct[0].dd_total)
                    yearly_takehome = float(monthly_takehome) * 12
                    monthly_ctc = float(employee_details[0].total_component_amount) + float(employee_details[0].total_bonus) + float(employee_details[0].cc_sum)
                    yearly_ctc = float(monthly_ctc) * 12
                    employee_pay.employeepay_detail = employee_details
                    employee_pay.deduction_data = employee_deduct
                    employee_pay.take_home = "{:.2f}".format(monthly_takehome)
                    employee_pay.yearly_take_home = "{:.2f}".format(yearly_takehome)
                    employee_pay.standard_ctc = "{:.2f}".format(monthly_ctc)
                    employee_pay.standard_yearly_ctc = "{:.2f}".format(yearly_ctc)
                    emp_data = Payrollcommon_Apicall(scope).emp_info(emp_id)
                    emp_designation = Payrollcommon_Apicall(scope).emp_details_payroll(emp_id)
                    designation = emp_designation.get('designation')
                    employee_pay.doj = datetime.strptime(str(emp_data.get('doj')), "%Y-%m-%d").strftime("%d %b %Y") if emp_data.get('doj') else 'XXXX'
                    employee_pay.designation = designation
                    arr.append(employee_pay)
                    context = {'employee_pay': employee_pay}
                    context['logopath'] = Employeemonthlypay_detailsService(scope).logopath
                    response = HttpResponse(content_type='application/pdf')
                    template = loader.get_template('ytdsummar_code.html')
                    html = template.render(context)
                    pisa.CreatePDF(html, dest=response)
                    data = read_pdf(response.content)
                    return data
                else:
                    emp_data = Payrollcommon_Apicall(scope).emp_info(emp_id)
                    desgination_data = HrmsApiService(scope).fetch_designation(emp_data.get('designation'))
                    if desgination_data is None:
                        error_obj = NWisefinError()
                        error_obj.set_code(ErrorMessage.INVALID_designation_ID)
                        error_obj.set_description(ErrorDescription.INVALID_designation_ID)
                        return error_obj
                    # desgination_data = DesignationService(scope).fetch_designation(emp_data.designation)
                    doj_date1 = datetime.strptime(str(emp_data.get('doj')), "%Y-%m-%d").strftime("%d %b %Y") if emp_data.get('doj') else 'XXXX'
                    employee_pay = {'designation': desgination_data.get('name'), 'doj': doj_date1, 'employee_name': emp_data.get('full_name')}
                    context = {'employee_pay': employee_pay}
                    context['logopath'] = Employeemonthlypay_detailsService(scope).logopath
                    response = HttpResponse(content_type='application/pdf')
                    template = loader.get_template('duplicate_offer_template.html')
                    html = template.render(context)
                    pisa.CreatePDF(html, dest=response)
                    data = read_pdf(response.content)
                    return data
            elif action == '2':
                payroll_serv = EmployeePaystructureService(scope).employee_level_get(emp_id)
                arr = NWisefinList()
                if len(payroll_serv) > 0:
                    employee_pay = EmployeePaystructureService(scope).employee_pay_get(payroll_serv[0].id)
                    employee_details = EmployeePaystructure_detailsService(scope).employee_level_detail(payroll_serv[0].id)
                    employee_deduct = EmployeePaystructure_deductionsService(scope).employeepaystruct_deduct(emp_id)
                    monthly_takehome = float(employee_details[0].total_component_amount) + float(employee_details[0].total_bonus) - float(employee_deduct[0].dd_total)
                    yearly_takehome = float(monthly_takehome) * 12
                    monthly_takehome_str = "{:.2f}".format(monthly_takehome) #syntax is used to format the floating-point values with two decimal places.
                    yearly_takehome_str = "{:.2f}".format(yearly_takehome)
                    monthly_ctc = float(employee_details[0].total_component_amount) + float(employee_details[0].total_bonus) + float(employee_details[0].cc_sum)
                    yearly_ctc = float(monthly_ctc) * 12
                    monthly_ctc_str = "{:.2f}".format(monthly_ctc)
                    yearly_ctc_str = "{:.2f}".format(yearly_ctc)
                    employee_pay.employeepay_detail = employee_details
                    employee_pay.deduction_data = employee_deduct
                    employee_pay.take_home = monthly_takehome_str
                    employee_pay.yearly_take_home = yearly_takehome_str
                    employee_pay.standard_ctc = monthly_ctc_str
                    employee_pay.yearly_standard_ctc = yearly_ctc_str
                    arr.append(employee_pay)
                    response = HttpResponse(arr.get(), content_type='application/json')
                    return response
                else:
                    arr = NWisefinList()
                    return HttpResponse(arr.get(), content_type='application/json')
        else:
            error_obj = NWisefinError()
            error_obj.set_message('invalid inputs')
            response = HttpResponse(error_obj.get(), "application/json")
            return response


# DROPDOWN PAY_MODE
@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def pay_mode_dropdown(request):
        util = paymode_dropdown()
        response = HttpResponse(util.get(), content_type="application/json")
        return response



# paystatus_dropdown
@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def paystatus_dropdown(request):
        util = advancestatus_dropdown()
        response = HttpResponse(util.get(), content_type="application/json")
        return response

# excel upload paystruct,paystructdetail,deduction
@csrf_exempt
@api_view(['POST'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def paystruct_details_excel_upload(request):
    scope = request.scope
    if request.method == 'POST':
        user_id = request.employee_id
        paystruct_service = EmployeePaystructureService(scope)
        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)
        for struct_data in struct_obj:
            data_obj = paystruct_service.paystructure_excel_upload(struct_data, user_id)
            print(data_obj)
            if data_obj.message != 'TRY AGAIN VALID DATA':
                data = data_obj.id
                gross_pay = data_obj.gross_pay
                df2 = excel_data['Sheet2']
                dfsheet2 = pd.DataFrame(df2)
                details_obj = dfsheet2.fillna(np.nan).replace([np.nan], [None]).to_dict(orient='records')
                for details_data in details_obj:
                    if struct_data['ID'] == details_data['C_ID']:
                        resp_obj = EmployeePaystructure_detailsService(scope).struct_detail_excel_upload(details_data, user_id,data,gross_pay)
        df3=excel_data['Sheet3']
        dfsheet3 = pd.DataFrame(df3)
        deduct_obj = dfsheet3.fillna(np.nan).replace([np.nan], [None]).to_dict(orient='records')
        res_obj = EmployeePaystructure_deductionsService(scope).struct_deduct_excel_upload(deduct_obj,user_id)
        response = HttpResponse(data_obj.get(), "application/json")
        return response


# excel template
@csrf_exempt
@api_view(['POST'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def paystructure_excel_template(request):
    finaldf = ['ID', 'EMPLOYEE_CODE', 'GROSS_PAY', 'PF_TYPE']
    finaldf1 = ['PAYCOMPONENT', 'PAYCOMPONENT_PERCENTAGE', 'PAYCOMPONENT_TYPE', 'AMOUNT', 'COMPANY_CONTRIBUTION','TYPE','C_ID']
    finaldf2 = ['TYPE', 'EMPLOYEE_CODE', 'PAYCOMPONENT_ID', 'AMOUNT']
    df = pd.DataFrame(columns=finaldf)
    df1 = pd.DataFrame(columns=finaldf1)
    df2 = pd.DataFrame(columns=finaldf2)
    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)
    df1.to_excel(writer, sheet_name='Sheet2', index=False)
    df2.to_excel(writer, sheet_name='Sheet3', index=False)
    writer.close()
    filename = 'PAY STRUCTURE TEMPLATE'
    format['Content-Disposition'] = 'attachment; filename="' + filename + '.xlsx"'
    return format


@csrf_exempt
@api_view(['POST'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def reverse_calculation(request):
    if request.method == 'POST':
        data_json = json.loads(request.body)
        take_home = data_json['takehome']
        actual_basic_percentage = data_json['actual_basic_percentage']
        basic_block_percentage = data_json['basic_block_percentage']
        pf_percentage = data_json['pf_percentage']
        esi_percentage = data_json['esi_percentage']
        actual_pf_percentage = pf_percentage/100
        esi_percentage_val = esi_percentage/100
        basic_and_actual_percentage = (int(actual_basic_percentage)/100*int(basic_block_percentage)/100)
        final_pf_percentage = basic_and_actual_percentage * actual_pf_percentage
        final_amt = 1-final_pf_percentage-esi_percentage_val
        final_result = int(take_home)/final_amt
        pf_amount = final_result*final_pf_percentage
        esi_amount = final_result*esi_percentage_val
        data = {"pf_percentage": final_pf_percentage, "gross_pay": final_result, "pf_amount": pf_amount,
                "take_home": take_home, "esi_amount": esi_amount, 'esi_percentage': esi_percentage_val}
        json_data = json.dumps(data, indent=4)
        response = HttpResponse(json_data, content_type='application/json')
        return response


@csrf_exempt
@api_view(['POST','GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated,NWisefinPermission])
def create_emp_pay1(request):
    scope = request.scope
    if request.method == 'POST':
        data_json = json.loads(request.body)
        employee_request = EmployeePaystructureRequest(data_json)
        user_id = request.employee_id
        paystruct_service = EmployeePaystructureService(scope)
        paystruct_detail = data_json.get("company_contribution")
        segment_detail = data_json.get("segment_details")
        deduction_detail = data_json.get("employee_contribution")
        # bonus_detail = data_json.get("bonus")
        resp_obj = paystruct_service.create_employeepay_struct1(request, employee_request, user_id)
        if resp_obj.message != 'ALREADY EXISTS IN EMPLOYEE CODE':
            struct_id = resp_obj.id
            take_home = resp_obj.take_home
            employee_id = resp_obj.employee_id
            if "segment_details" in data_json or "segment_details" != None:
                for data_record in segment_detail:
                    if data_record['is_customdeduct'] == 0:
                    # for paycom in data_record['paycomponent_data']:
                        detail_obj = EmployeePaystructure_detailsRequest(data_record)
                        data_obj = EmployeePaystructure_detailsService(scope).create_employeepay_structdetails1(request, detail_obj, user_id, struct_id, take_home,employee_id)
                    # else:
                        # deduct_obj = EmployeePaystructure_deductionsRequest(data_record)
                        # resp = EmployeePaystructure_deductionsService(scope).create_employeepay_structdeduct1(deduct_obj, user_id, employee_id)
            if "company_contribution" in data_json or "company_contribution" != None:
                for data_record in paystruct_detail:
                    detail_obj = EmployeePaystructure_detailsRequest(data_record)
                    data_obj = EmployeePaystructure_detailsService(scope).create_employeepay_structdetails1(request,detail_obj, user_id, struct_id, take_home,employee_id)
            # if "bonus" in data_json or "bonus" != None:
            #     for data_record in bonus_detail:
            #         detail_obj = EmployeePaystructure_detailsRequest(data_record)
            #         data_obj = EmployeePaystructure_detailsService(scope).create_employeepay_structdetails1(request, detail_obj,  user_id,  struct_id, take_home)
            if "employee_contribution" in data_json or "employee_contribution" != None:
                for deduct_data in deduction_detail:
                    deduct_obj = EmployeePaystructure_deductionsRequest(deduct_data)
                    resp = EmployeePaystructure_deductionsService(scope).create_employeepay_structdeduct1(deduct_obj, user_id,employee_id)
            response = HttpResponse(resp_obj.get(), content_type="application/json")
        else:
            response = HttpResponse(resp_obj.get(), content_type="application/json")
        return response

@csrf_exempt
@api_view(['POST', 'GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def grade_emp_based_structure_get(request, employee_id, grade):
        scope = request.scope
        if request.method == 'GET':
            struct_data = EmployeePaystructureService(scope).grade_emp_based_structure_get(request, employee_id, grade)
            # struct_details = EmployeePaystructure_detailsService(scope).employee_structure_get(struct_data.id)
            print(struct_data)
            # print(struct_details)
            response = HttpResponse(struct_data.get(), content_type="application/json")
            return response



# excel upload paystruct,paystructdetail,deduction
@csrf_exempt
@api_view(['POST'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def paystruct_details_excel_upload1(request):
    scope = request.scope
    if request.method == 'POST':
        user_id = request.employee_id
        paystruct_service = EmployeePaystructureService(scope)
        excel_data = pd.read_excel(request.FILES['file'], engine='openpyxl',sheet_name=None)
        df1 = excel_data['Sheet1']
        df = pd.DataFrame(df1)
        df['FROM_DATE'] = pd.to_datetime(df['FROM_DATE'], errors='coerce')
        df['TO_DATE'] = pd.to_datetime(df['TO_DATE'], errors='coerce')
        struct_obj = df.fillna(np.nan).replace([np.nan], [None]).to_dict(orient='records')
        print(struct_obj)
        for struct_data in struct_obj:
            data_obj = paystruct_service.paystructure_excel_upload1(struct_data, user_id)
            print(data_obj)
            if data_obj.message != 'INVALID_DATA':
                logger.info("upload paystruct id" + str(data_obj.id))
                data = data_obj.id
                gross_pay = data_obj.gross_pay
                employee_id = data_obj.employee_id
                pf_type = data_obj.pf_type
                is_esi = data_obj.is_esi
                # esi = data_obj.esi
                df2 = excel_data['Sheet2']
                dfsheet2 = pd.DataFrame(df2)
                details_obj = dfsheet2.fillna(np.nan).replace([np.nan], [None]).to_dict(orient='records')
                for details_data in details_obj:
                    if struct_data['ID'] == details_data['C_ID']:
                        resp_obj = EmployeePaystructure_detailsService(scope).struct_detail_excel_upload1(details_data, user_id,data,gross_pay,employee_id,pf_type,is_esi)
                cc_obj = EmployeePaystructure_detailsService(scope).cc_struct_detail_excel_upload(user_id,data,employee_id,int(pf_type),is_esi)
                res_obj = EmployeePaystructure_deductionsService(scope).struct_deduct_excel_upload1(user_id,employee_id,int(pf_type),is_esi)
            logger.info("upload paystruct" + str(data_obj.get()))
            response = HttpResponse(data_obj.get(), "application/json")
        return response


# excel template
@csrf_exempt
@api_view(['POST'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def paystructure_excel_template1(request):
    scope = request.scope
    finaldf = ['ID', 'EMPLOYEE_CODE', 'STANDARD_CTC', 'TAKE_HOME', 'GROSS_PAY', 'PF_TYPE', 'IS_ESI','TEMPLATE','FROM_DATE','TO_DATE']
    finaldf1 = ['PAYCOMPONENT', 'PAYCOMPONENT_PERCENTAGE', 'PAYCOMPONENT_TYPE', 'AMOUNT', 'COMPANY_CONTRIBUTION',
                'TYPE', 'C_ID', 'FROM_DATE', 'TO_DATE', 'SEGMENT', 'SEGMENT_PERCENTAGE']
    paycom_data = PayrollComponentService(scope).payrollcomtemplate_upload()
    segment_paycom_data = PayrollSegementMappingService(scope).strcut_uploadteam_segmentdetails()
    template_paycom_data = PayrollmastermappingService(scope).get_template_based_segment()
    print('data', paycom_data)
    df = pd.DataFrame(columns=finaldf)
    df1 = pd.DataFrame(columns=finaldf1)
    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)
    df1.to_excel(writer, sheet_name='Sheet2', index=False)
    paycom_data.to_excel(writer, sheet_name='Sheet3', startrow=2, startcol=2)
    segment_paycom_data.to_excel(writer, sheet_name='Sheet3', startrow=2, startcol=8)
    template_paycom_data.to_excel(writer, sheet_name='Sheet4', startrow=2, startcol=2)
    writer.close()
    filename = 'PAY STRUCTURE TEMPLATE'
    format['Content-Disposition'] = 'attachment; filename="' + filename + '.xlsx"'
    return format

@csrf_exempt
@api_view(['GET'])
@authentication_classes([NWisefinAuthentication])
@permission_classes([IsAuthenticated, NWisefinPermission])
def emp_details_segment_data(request):
    scope = request.scope
    if request.method == 'GET':
        employee_id = request.GET.get('employee_id')
        grade = request.GET.get('grade')
        template_id = request.GET.get('template_id')
        obj = EmployeePaystructureService(scope).emp_details_segment_data(employee_id,template_id)
        if obj != None:
            company_contribution_data = EmployeePaystructure_detailsService(scope).company_contribution_data(obj['id'])
            # employee_deduction_data = EmployeePaystructure_deductionsService(scope).employee_deduction(employee_id)
            employee_deduction_data = EmployeePaystructure_deductionsService(scope).employee_deduction1(employee_id)
            without_company_contribution_data = EmployeePaystructure_detailsService(scope).without_cmpny_contribution(obj['id'])
            total_deduct_amount = 0.0
            total_bonus_amount = 0.0
            for i in employee_deduction_data:
                if i['type']['id'] is not None:
                    deduct_amount = float(i['deduction_amount'])
                    total_deduct_amount += deduct_amount
            for j in without_company_contribution_data:
                if j['component_category_type'] == 'BONUS':
                    for k in j['paycomponent_data']:
                       bonus_amount = float(k['amount'])
                       total_bonus_amount += bonus_amount
            take_home = obj['take_home']
            takehome_bonusdeduct = float(take_home)+float(total_bonus_amount)+float(total_deduct_amount)
            obj['company_contribution'] = company_contribution_data
            obj['employee_contribution'] = employee_deduction_data
            obj["segment_details"] = without_company_contribution_data
            obj['takehome_bonusdeduct'] = "{:.2f}".format(takehome_bonusdeduct)
            json_data = json.dumps(obj, indent=4)
            response = HttpResponse(json_data, content_type='application/json')
            return response
        else:
            mst_serv = EmployeePaystructureService(scope).common_master_data_for_segment(grade, template_id)
            json_data = json.dumps(mst_serv,indent=4)
            response = HttpResponse(json_data, content_type='application')
            return response



# create watermarked booklet
# def final_booklets(booklet,file_name):
#     watermark_obj = PdfFileReader(file_name)
#     # watermark_page = watermark_obj.getNumPages()
#     pdf_reader = PdfFileReader(booklet)
#     # pdf_reader_page = pdf_reader.getNumPages()
#     pdf_writer = PdfFileWriter()
#     # Watermark all the pages
#     for pageno in range(pdf_reader.getNumPages()):
#         page = pdf_reader.getPage(pageno)
#         page.mergePage(watermark_obj.getPage(pageno))
#         pdf_writer.addPage(page)
#     output3 = io.BytesIO()
#     pdf_writer.write(output3)
#     return output3
# def watermark_pdf(watermark_data,file):
#     output = io.BytesIO()
#     c = canvas.Canvas(output)
#     pdf_reader = PdfFileReader(file)
#     for page in range(pdf_reader.getNumPages()):
#         c.saveState()
#         c.setFillColor(HexColor('#808080'), 0.30)
#         c.setFont("Helvetica", 20)
#         c.translate(15*cm, 20*cm)
#         c.rotate(45)
#         c.drawCentredString(0,0,watermark_data)
#         c.restoreState()
#         c.showPage()
#     c.save()
#     output = final_booklets(file,output)
#     return output
# Read the sheet to get everyones email address
# def read_pdf(pdf_data):
#     watermark_data = "VSOLV ENGINEERING INDIA PRIVATE LIMITED"
#     file = io.BytesIO(pdf_data)
#     output = watermark_pdf(watermark_data,file)
#     response= HttpResponse(output.getvalue(), content_type='application/pdf')
#     output.close()
#     return response



def final_booklets(booklet, watermark_file):
    watermark_reader = PdfReader(watermark_file)
    pdf_reader = PdfReader(booklet)
    pdf_writer = PdfWriter()

    for pageno in range(len(pdf_reader.pages)):
        page = pdf_reader.pages[pageno]
        watermark_page = watermark_reader.pages[pageno]
        page.merge_page(watermark_page)  # Updated method name
        pdf_writer.add_page(page)

    output3 = io.BytesIO()
    pdf_writer.write(output3)
    output3.seek(0)
    return output3



def watermark_pdf(watermark_data, file):
    output = io.BytesIO()

    file.seek(0)
    reader = PdfReader(file)
    num_pages = len(reader.pages)

    c = canvas.Canvas(output)
    for _ in range(num_pages):
        c.saveState()
        c.setFillColor(HexColor('#808080'), alpha=0.30)
        c.setFont("Helvetica", 20)
        c.translate(15*cm, 20*cm)
        c.rotate(45)
        c.drawCentredString(0, 0, watermark_data)
        c.restoreState()
        c.showPage()
    c.save()

    output.seek(0)
    file.seek(0)
    return final_booklets(file, output)


def read_pdf(pdf_data):
    watermark_data = "VSOLV ENGINEERING INDIA PRIVATE LIMITED"
    file = io.BytesIO(pdf_data)
    file.seek(0)
    output = watermark_pdf(watermark_data, file)
    response = HttpResponse(output.getvalue(), content_type='application/pdf')
    output.close()
    return response
