import json

from django.db.models import Q, QuerySet
# from masterservice.service.Codegenerator import CommonCodeGenService
# from masterservice.service.bankservice import BankService
# from masterservice.service.ccbsservice import CostCentreService, BusinessSegmentService
# from masterservice.service.gradeservice import GradeService
from payrollservice.util.payrollutil import Activestatus
from payrollservice.data.response.employeeresponse import EmployeeResponse
# from userservice.models import Employee
# from userservice.service.employeebankdetailsservice import EmployeeBankDetailsService
# from userservice.service.employeedepartmentservice import EmployeeDepartmentService
# from userservice.service.employeeservice import EmployeeService
# from userservice.service.roleemployeeservice import RoleEmployeeService
from utilityservice.data.response.nwisefinlist import NWisefinList
from utilityservice.permissions.filter.commonpermission import ModulePermission
from utilityservice.permissions.util.dbutil import RoleList, ModuleList
from utilityservice.service.applicationconstants import ApplicationNamespace
from utilityservice.service.threadlocal import NWisefinThread
from hrmsmasterapiservice.hrmsmasterapi.masteranduserserviceapi import HrmsApiService


class Payrollcommon_Apicall(NWisefinThread):
    def __init__(self, scope):
        super().__init__(scope)
        self._set_namespace(ApplicationNamespace.PAYROLL_SERVICE)

    MICRO_SERVICE = True

    def get_emp_list_info(self, empid_arr):
        if self.MICRO_SERVICE:
            emp_ser = HrmsApiService(self._scope())
            emp = emp_ser.get_emp_list_info(empid_arr)
            return emp
        else:
            pass

    def emp_info(self, id):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_details = emp_serv.emp_id_info(id)
            emp_serv = HrmsApiService(self._scope())
            emp_details = emp_serv.emp_id_info(id)
            return emp_details
        else:
            pass

    def emp_code(self, code):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_details = emp_serv.get_empdtls_using_empcode(code)
            emp_serv = HrmsApiService(self._scope())
            emp_details = emp_serv.get_empdtls_using_empcode(code)
            return emp_details
        else:
            pass

    def emp_details_payroll(self, id):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_details = emp_serv.employee_details_payroll(id)
            emp_serv = HrmsApiService(self._scope())
            emp_details = emp_serv.employee_details_payroll(id)
            return emp_details
        else:
            pass


    def employee_id_get(self, employee_id):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_get = emp_serv.employee_id_get(employee_id)
            emp_serv = HrmsApiService(self._scope())
            emp_get = emp_serv.employee_id_get(employee_id)
            return emp_get
        else:
            pass


    def employee_data(self, id):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_get = emp_serv.employee_data(id)
            emp_serv = HrmsApiService(self._scope())
            emp_get = emp_serv.employee_data(id)
            return emp_get
        else:
            pass

    def emp_arr_function(self,query):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_get = emp_serv.emp_arr_function(query)
            emp_serv = HrmsApiService(self._scope())
            emp_get = emp_serv.emp_arr_function(query)
            return emp_get
        else:
            pass

    def dropdown_cc(self):
        if self.MICRO_SERVICE:
            # cc_serv = CostCentreService(self._scope())
            # emp_get = cc_serv.dropdown_cc()
            cc_serv = HrmsApiService(self._scope())
            emp_get = cc_serv.get_dropdown_cc()
            if isinstance(emp_get, dict):
                cc = emp_get
            else:
                cc = dict()
            return json.dumps(cc)
        else:
            pass

    def dropdown_bs(self):
        if self.MICRO_SERVICE:
            # bs_serv = BusinessSegmentService(self._scope())
            # emp_get = bs_serv.dropdown_bs()
            bs_serv = HrmsApiService(self._scope())
            emp_get = bs_serv.get_dropdown_bs()
            if isinstance(emp_get, dict):
                bs = emp_get
            else:
                bs = dict()

            return json.dumps(bs)
        else:
            pass

    def emp_arr_cc_bs(self,emp_cc, emp_bs):
        if self.MICRO_SERVICE:
            # emp_Serv = EmployeeService(self._scope())
            # emp_get = emp_Serv.emp_arr_cc_bs(emp_cc, emp_bs)
            emp_Serv = HrmsApiService(self._scope())
            emp_get = emp_Serv.emp_arr_cc_bs(emp_cc, emp_bs)
            if emp_get is not None:
                return emp_get
            else:
                return list()
        else:
            pass

    def emp_data_cc_bs(self,employee):
        if self.MICRO_SERVICE:
            # emp_Serv = EmployeeService(self._scope())
            # emp_get = emp_Serv.emp_data_cc_bs(employee)
            emp_Serv = HrmsApiService(self._scope())
            emp_get = emp_Serv.emp_data_cc_bs(employee)
            return emp_get
        else:
            pass



    def employee_detail_arr(self, employee_id):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_get = emp_serv.employee_detail_arr(employee_id)
            emp_serv = HrmsApiService(self._scope())
            emp_get = emp_serv.employee_detail_arr(employee_id)
            return emp_get
        else:
            pass

    def employee_get_value(self, employee_id):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_get = emp_serv.employee_get_value(employee_id)
            emp_serv = HrmsApiService(self._scope())
            emp_get = emp_serv.employee_get_value(employee_id)
            return emp_get
        else:
            pass


    def employee_overall_data(self):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_get = emp_serv.employee_overall_data()
            emp_serv = HrmsApiService(self._scope())
            emp_get = emp_serv.employee_overall_data()
            return emp_get
        else:
            pass

    # def get_paycom_details(self, id_arr):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollComponentService(self._scope()).get_paycom_details(id_arr)
    #         return mst_serv
    #     else:
    #         pass

    # def get_default_components(self):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollComponentService(self._scope()).get_default_components()
    #         return mst_serv
    #     else:
    #         pass


    # def get_payroll_component(self, id_arr):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollComponentService(self._scope()).get_multiple_payroll_component_val(id_arr)
    #         return mst_serv
    #     else:
    #         pass

    # def get_component_val(self, id_val):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollComponentService(self._scope()).get_payroll_component(id_val)
    #         return mst_serv
    #     else:
    #         pass

    # def get_component_name(self,id_val):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollComponentService(self._scope()).get_payrollcomponent_name(id_val)
    #         return mst_serv
    #     else:
    #         pass
    # def get_employee_pfstruc_data(self,id_arr):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PaycomponentFlagmasterService(self._scope()).get_employee_pf_data(id_arr)
    #         return mst_serv
    #     else:
    #         pass
    # def get_structure_data_obj(self,id_data):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PaycomponentFlagmasterService(self._scope()).get_structure_data(id_data)
    #         return mst_serv

    # def get_multiple_emp_pf_struct(self, id_arr):
    #     if self.MICRO_SERVICE:
    #         mst_serv = EmployeePFService(self._scope()).get_multiple_emp_pf(id_arr)
    #         return mst_serv
    #     else:
    #         pass

    # def get_employeepf_details(self, id_arr):
    #     if self.MICRO_SERVICE:
    #         mst_serv = EmployeePFService(self._scope()).get_employeepf_details(id_arr)
    #         return mst_serv
    #     else:
    #         pass

    # def get_pf_name(self, id_arr):
    #     if self.MICRO_SERVICE:
    #         mst_serv = EmployeePFService(self._scope()).get_pf_name(id_arr)
    #         return mst_serv
    #     else:
    #         pass

    # def get_pf_type(self, id_arr):
    #     if self.MICRO_SERVICE:
    #         mst_serv = EmployeePFService(self._scope()).get_pf_type(id_arr)
    #         return mst_serv
    #     else:
    #         pass

    # def get_emp_pf_info(self, id_val):
    #     if self.MICRO_SERVICE:
    #         mst_serv = EmployeePFService(self._scope()).get_emp_pf_info(id_val)
    #         return mst_serv
    #     else:
    #         pass

    # def get_paycomponent_flag_data(self, pf_info_id):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PaycomponentFlagmasterService(self._scope()).get_paycomponent_flag_val(pf_info_id)
    #         return mst_serv
    #     else:
    #         pass
    # def list_of_map_id_data(self,map_id):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PaycomponentFlagmasterService(self._scope()).list_of_map_id_val(map_id)
    #         return mst_serv
    #     else:
    #         pass

    # def paycomponent_data(self,paycomponent_id):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PaycomponentFlagmasterService(self._scope()).get_paycomponent_data(paycomponent_id)
    #         return mst_serv
    #     else:
    #         pass

    # def component_data(self, paycomponent_data):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PaycomponentFlagmasterService(self._scope()).get_component_values(paycomponent_data)
    #         return mst_serv
    #     else:
    #         pass

    # def get_company_contribution_data(self, paycomponent_id):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PaycomponentFlagmasterService(self._scope()).get_companycontri_data(paycomponent_id)
    #         return mst_serv
    #     else:
    #         pass

    # def get_companycontribution_multi_data(self, paycomponent):
    #     if self.MICRO_SERVICE:
    #         mst_serv = CompanyContributionService(self._scope()).get_multiple_contribution(paycomponent)
    #         return mst_serv
    #     else:
    #         pass

    # def company_contribution_values(self,company_contribution):
    #     if self.MICRO_SERVICE:
    #         mst_serv = CompanyContributionService(self._scope()).company_contribution_val(company_contribution)
    #         return mst_serv
    #     else:
    #         pass

    # def company_contribution_data(self,id_data):
    #     if self.MICRO_SERVICE:
    #         mst_serv = CompanyContributionService(self._scope()).company_contribution_data(id_data)
    #         return mst_serv
    #     else:
    #         pass


    def payslip_gen_code(self,params, emp_id, employee_id):
        if self.MICRO_SERVICE:
            code_serv = HrmsApiService(self._scope())
            data_dict = {'params':params,'emp_id':emp_id,'employee_id':employee_id}
            code = code_serv.payslip_gen_code(data_dict)
            return code
        else:
            pass

    def employee_role_check(self, emp_id, module, find_role_id,find_role):
        module_permission = ModulePermission(self._scope())
        role_arr = module_permission.employee_modulerole(emp_id, module)
        if find_role_id == 'employee advance':
            if RoleList.PAYROLL_CHECKER in role_arr and find_role != 'checker create':
                role = RoleList.PAYROLL_ADMIN
            elif RoleList.PAYROLL_ADMIN in role_arr:
                role = RoleList.PAYROLL_CHECKER
            else:
                role = RoleList.PAYROLL_CHECKER
        else:
            if RoleList.PAYROLL_ADMIN in role_arr:
                role = 1
            elif RoleList.PAYROLL_CHECKER in role_arr:
                role = 2
            else:
                 role = 0
        return role

    # def get_componenttype_name(self, name):
    #     if self.MICRO_SERVICE:
    #         mst_serv = ComponentTypeService(self._scope()).get_componenttype_name(name)
    #         return mst_serv
    #     else:
    #         pass


    # def get_payrollcomponent_val(self, name):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollComponentService(self._scope()).get_payrollcomponent_val(name)
    #         return mst_serv
    #     else:
    #         pass


    # def get_segment_dta(self, segment_id):
    #     if self.MICRO_SERVICE:
    #         mst_serv = SegmentMasterService(self._scope()).get_multiple_segment_data(segment_id)
    #         return mst_serv
    #     else:
    #         pass

    # def single_segment_dta(self,segment_id):
    #     if self.MICRO_SERVICE:
    #         mst_serv = SegmentMasterService(self._scope()).get_segmentmaster(segment_id)
    #         return mst_serv
    #     else:
    #         pass

    # def segment_details_data(self, id_arr):
    #     if self.MICRO_SERVICE:
    #         mst_serv = SegmentMasterService(self._scope()).segment_details_data(id_arr)
    #         return mst_serv
    #     else:
    #         pass


    # def get_segment_based_paycom(self, paycom_id):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollmastermappingService(self._scope()).get_segment_based_paycom(paycom_id)
    #         return mst_serv
    #     else:
    #         pass

    def payroll_admin_role(self,find_role):
        if self.MICRO_SERVICE:
            # find_role = RoleEmployeeService(self._scope()).payroll_admin_role(find_role)
            find_role = HrmsApiService(self._scope()).payroll_admin_role(find_role)
            return find_role
        else:
            pass


    def employee_payroll_admin(self,find_role_id,find_role,employeename,user_id):
        module = ModuleList.Employee_Payroll
        find_role = self.employee_role_check(user_id, module, find_role_id,find_role)
        find_role_id = self.payroll_admin_role(find_role)
        # condition = Q(status=Activestatus.active)&~Q(id=user_id)
        # if employeename != None and employeename != "":
        #     condition &= (Q(full_name__icontains=employeename) | Q(code__icontains=employeename))
        emp_data = HrmsApiService(self._scope()).get_emp_list_by_id({"id":user_id,"status":Activestatus.active,"emp_name":employeename,"emp_arr":find_role_id})
        # emp_data = Employee.objects.using(self._current_app_schema()).filter(condition,id__in=find_role_id)
        arr = NWisefinList()
        for employee in emp_data:
            data_resp = EmployeeResponse()
            employee_name = '(' + employee.get('code') + ') ' + employee.get('full_name')
            data_resp.set_id(employee.get('id'))
            data_resp.full_name = employee_name
            arr.append(data_resp)
        return arr


    def grade_employee(self,  employee_id, grade):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_get = emp_serv.grade_employee(employee_id, grade)
            emp_serv = HrmsApiService(self._scope())
            emp_get = emp_serv.grade_employee(employee_id, grade)
            if emp_get is not None:
                return emp_get
            else:
                return list()
        else:
            pass


    # def company_contribution_data_get(self, id_data):
    #     if self.MICRO_SERVICE:
    #         cc_serv = CompanyContributionService(self._scope()).company_contribution_data_get(id_data)
    #         return cc_serv
    #     else:
    #         pass

    # def segment_data_for_get(self, seg_id, paycomponent_id):
    #     if self.MICRO_SERVICE:
    #         mst_serv = SegmentMasterService(self._scope()).segment_for_structure_get(seg_id, paycomponent_id)
    #         return mst_serv
    #     else:
    #         pass
    # ---------------------------
    # this function not callable
    # def paystruct_details_data_val(self,id_data):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollComponentService(self._scope()).paystruct_details_data(id_data)
    #         return mst_serv
    #     else:
    #         pass
    # # this function not callable
    # def segment_data_paycomponent_values(self, segment_id, paycomponent_arr):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollTemplateService(self._scope()).segment_data1(segment_id, paycomponent_arr)
    #         return mst_serv
    #     else:
    #         pass
    # ---------------
    # def get_employee_pf_data(self):
    #     if self.MICRO_SERVICE:
    #         mst_serv = EmployeePFService(self._scope()).get_employeepfstruct_details()
    #         return mst_serv
    #     else:
    #         pass

    # def cc_epf_based_paycom(self, map_id, ref_type):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PaycomponentFlagmasterService(self._scope()).cc_epf_based_paycom(map_id,ref_type)
    #         return mst_serv
    #     else:
    #         pass


    # def get_cc_paycom_details(self,):
    #     if self.MICRO_SERVICE:
    #         mst_serv = CompanyContributionService(self._scope()).get_cc_paycom_details()

    # def common_master_data_for_segment(self, grade):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollTemplateService(self._scope()).grade_based_segment_data2(grade)
    #         return mst_serv
    #     else:
    #         pass

    # def get_segment_name(self, name):
    #     if self.MICRO_SERVICE:
    #         mst_serv = SegmentMasterService(self._scope()).get_segment_name(name)
    #         return mst_serv
    #     else:
    #         pass

    # def cal_employeepf_data(self, id_arr):
    #     if self.MICRO_SERVICE:
    #         mst_serv = EmployeePFService(self._scope()).cal_employeepf_data(id_arr)
    #         return mst_serv
    #     else:
    #         pass

    # def segment_wise_employee_pf_data(self, employee_pf_id):
    #     if self.MICRO_SERVICE:
    #         mst_serv = EmployeePFService(self._scope()).segment_wise_employee_pf(employee_pf_id)
    #         return mst_serv
    #     else:
    #         pass

    # def paycomponent_details_dta(self,paycomponent_id):
    #     if self.MICRO_SERVICE:
    #         mst_serv = PayrollComponentService(self._scope()).paycomponent_details_data(paycomponent_id)
    #         return mst_serv
    #     else:
    #         pass


    def get_bank_namepay(self,bank_name):
        if self.MICRO_SERVICE:
            mst_serv = HrmsApiService(self._scope()).get_bank_namepay(bank_name)
            # mst_serv = BankService(self._scope()).get_bank_namepay(bank_name)
            return mst_serv
        else:
            pass

    #grade
    def get_grade_data_by_id(self,grade):
        if self.MICRO_SERVICE:
            # mst_Serv = GradeService(self._scope()).get_grade_data_by_id(grade)
            mst_Serv = HrmsApiService(self._scope()).get_grade_data_by_id(grade)
            return mst_Serv
        else:
            pass

    def get_grade_details(self,grade):
        if self.MICRO_SERVICE:
            # mst_Serv = GradeService(self._scope()).get_grade_details(grade)
            data_dict = {'status':Activestatus.active,'id':grade}
            mst_Serv = HrmsApiService(self._scope()).get_grade_by_id(data_dict)
            return mst_Serv
        else:
            pass

    def get_grade(self,grade):
        if self.MICRO_SERVICE:
            # mst_Serv = GradeService(self._scope()).get_grade(grade)
            mst_Serv = HrmsApiService(self._scope()).get_grade_data(grade)
            return mst_Serv
        else:
            pass

    def fetch_bank_details(self,bank_id_arr):
        if self.MICRO_SERVICE:
            mst_serv = HrmsApiService(self._scope()).fetch_bank_details(bank_id_arr)
            # mst_Serv = BankService(self._scope()).fetch_bank_details(bank_id_arr)
            return mst_serv
        else:
            pass


    def get_grade_name(self,grade):
        if self.MICRO_SERVICE:
            # mst_Serv = GradeService(self._scope()).get_grade_name(grade)
            mst_Serv = HrmsApiService(self._scope()).get_grade_by_name(grade)
            return mst_Serv
        else:
            pass

    def employee_payrolldetails(self,id_arr):
        if self.MICRO_SERVICE:
            # emp_serv = EmployeeService(self._scope())
            # emp_get = emp_serv.employee_payrolldetails(id_arr)
            emp_serv = HrmsApiService(self._scope())
            emp_get = emp_serv.employee_payrolldetails(id_arr)
            return emp_get
        else:
            pass

    def bank_template_based_employee(self,request,bank_id,user_id):
        if self.MICRO_SERVICE:
            # emp_get = EmployeeBankDetailsService(self._scope()).bank_template_based_employee1(request,bank_id,user_id)
            emp_get = HrmsApiService(self._scope()).bank_template_based_employee1(request,bank_id,user_id)
            return emp_get
        else:
            pass

    def get_employeecolumns(self):
        if self.MICRO_SERVICE:
            # emp_get = EmployeeService(self._scope()).get_employeecolumns()
            emp_get = HrmsApiService(self._scope()).get_employeecolumns()
            return emp_get
        else:
            pass

    def get_employeebankcolumns(self):
        if self.MICRO_SERVICE:
            # emp_get = EmployeeBankDetailsService(self._scope()).get_employeebankcolumns()
            emp_get = HrmsApiService(self._scope()).get_employeebankcolumns()
            return emp_get
        else:
            pass

    def emp_department(self, emp_id_arr):
        if self.MICRO_SERVICE:
            # empdept_details = EmployeeDepartmentService(self._scope()).get_multiple_emp_dept(emp_id_arr)
            empdept_details = HrmsApiService(self._scope()).get_multiple_emp_dept(emp_id_arr)
            return empdept_details
        else:
            pass

class DictObj:
    queryset_data = []
    result_set = []

    def get(self, dict1):
        if isinstance(dict1, str):
            dict1 = json.loads(dict1)
        self.__dict__.update(dict1)
        return self.__dict__

    def get_obj(self, dict1):
        if isinstance(dict1, QuerySet):

            for data in dict1:
                self.__dict__.update(data)
                self.queryset_data.append(self)
            return self.queryset_data
        else:
            self.__dict__.update(dict1)
            return self

    def values_list(self, field):
        for data in self.queryset_data:
            for key, value in data.items():
                if key == field:
                    self.result_set.append(value)
        return self.result_set