from django.contrib.messages import set_level

from hrmsmasterapiservice.hrmsmasterapi.apitoken import ApiToken
from utilityservice.service.threadlocal import NWisefinThread
from utilityservice.service.applicationconstants import ApplicationNamespace


class MasterAPIUtil:
    fetch_designation = 1
    get_grade_by_id = 2
    create_grade = 3
    grade_summary = 4
    grade_inactive = 5
    payslip_gen_code = 6
    get_bank_namepay = 7
    fetch_bank_details = 8
    dropdown_cc = 9
    dropdown_bs = 10
    get_grade_data_by_id = 11
    get_grade = 12
    get_grade_by_name = 13
    get_grade_dataframe = 14
    scope_for_multiple_entity = 15
    fetch_bank_values = 16
    commoncodegen = 17

class UserAPIUtil:
    get_emp_list_info = 1
    isbranchid_get= 2
    get_emp_info_by_id = 3
    fetch_employee_role = 4
    valid_module_role = 5
    valid_module = 6
    bank_template_based_employee1 = 7
    get_employeebankcolumns = 8
    get_multiple_emp_dept = 9
    payroll_admin_role = 10
    emp_id_info = 11
    get_empdtls_using_empcode =12
    employee_details_payroll = 13
    employee_id_get =14
    employee_data=15
    emp_arr_function = 16
    emp_arr_cc_bs = 17
    emp_data_cc_bs = 18
    employee_detail_arr = 19
    employee_get_value = 20
    employee_overall_data = 21
    grade_employee = 22
    employee_payrolldetails =23
    get_employeecolumns = 24
    get_single_emp_by_id = 25
    get_single_user_by_id = 26

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

    MICRO_SERVICE = True

    def get_master_api_data(self, type_val, data):
        value={"arg_type": type_val, "data": data}
        ven_obj_arr=ApiToken.Apitoken_post_method(self,value, "/mstserv/get_masters_data")
        if ven_obj_arr != None:
            try:
                if type_val == MasterAPIUtil.fetch_designation:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.get_grade_by_id:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.create_grade:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.grade_summary:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.grade_inactive:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.payslip_gen_code:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.get_bank_namepay:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.fetch_bank_details:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.dropdown_cc:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.dropdown_bs:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.get_grade_data_by_id:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.get_grade_by_name:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.get_grade_dataframe:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.scope_for_multiple_entity:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.fetch_bank_values:
                    return ven_obj_arr['data']
                elif type_val == MasterAPIUtil.commoncodegen:
                    return ven_obj_arr['data']

                else:
                    return
            except:
                return
        else:
            return


    def get_user_api_data(self, type_val, data):
        value={"arg_type": type_val, "data": data}
        ven_obj_arr=ApiToken.Apitoken_post_method(self,value,"/mstserv/get_user_api_data")
        if ven_obj_arr != None:
            try:
                if type_val == UserAPIUtil.get_emp_list_info:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.isbranchid_get:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.get_emp_info_by_id:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.fetch_employee_role:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.valid_module_role:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.valid_module:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.bank_template_based_employee1:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.get_employeebankcolumns:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.get_multiple_emp_dept:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.payroll_admin_role:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.emp_id_info:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.get_empdtls_using_empcode:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.employee_details_payroll:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.employee_id_get:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.employee_data:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.emp_arr_function:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.emp_arr_cc_bs:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.emp_data_cc_bs:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.employee_detail_arr:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.employee_get_value:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.employee_overall_data:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.grade_employee:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.employee_payrolldetails:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.get_employeecolumns:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.get_single_emp_by_id:
                    return ven_obj_arr['data']
                elif type_val == UserAPIUtil.get_single_user_by_id:
                    return ven_obj_arr['data']
                else:
                    return
            except:
                return
        else:
            return

    def get_emp_list_info(self,empid_arr):
        data = {"1": empid_arr}
        arr=[]
        emp_list = self.get_user_api_data(UserAPIUtil.get_emp_list_info, data)
        if emp_list !=None:
            return emp_list
        else:
            return arr

    def fetch_designation(self,designation):
        data = {"1": designation}
        design = self.get_master_api_data(MasterAPIUtil.fetch_designation, data)
        if design !=None:
            return design
        else:
            return

    def isbranchid_get(self,employee_branch):
        data = {'1':employee_branch}
        branch = self.get_user_api_data(UserAPIUtil.isbranchid_get,data)
        if branch != None:
            return branch
        else:
            return

    def get_grade_by_id(self,data_dict):
        data = {'1':data_dict}
        grade_get = self.get_master_api_data(MasterAPIUtil.get_grade_by_id,data)
        if grade_get !=None:
            return grade_get
        else:
            return

    def create_grade(self,data_dict):
        data = {'1':data_dict['grade_request']}
        grade_create = self.get_master_api_data(MasterAPIUtil.create_grade,data)
        if grade_create != None:
            return grade_create
        else:
            return

    def grade_summary_get(self,data_dict):
        data = {'1':data_dict}
        grade_summary = self.get_master_api_data(MasterAPIUtil.grade_summary,data)
        if grade_summary is not None:
            return grade_summary
        else:
            return list()

    def grade_inactive(self,data_dict):
        data = {'1':data_dict}
        grade_inactive = self.get_master_api_data(MasterAPIUtil.grade_inactive,data)
        if grade_inactive is not None:
            return grade_inactive
        else:
            return

    def payslip_gen_code(self,data_dict):
        data = {'1':data_dict["params"],'2':data_dict['emp_id'],'3':data_dict['employee_id']}
        payslip = self.get_master_api_data(MasterAPIUtil.payslip_gen_code,data)
        if payslip is not None:
            return payslip
        else:
            return

    def fetch_bank_details(self,bank_id_arr):
        data = {'1':bank_id_arr}
        bank_arr = self.get_master_api_data(MasterAPIUtil.fetch_bank_details,data)
        if bank_arr is not None:
            return bank_arr
        else:
            return

    def get_bank_namepay(self,bank_name):
        data = {'1':bank_name}
        bank_name_get = self.get_master_api_data(MasterAPIUtil.get_bank_namepay,data)
        if bank_name_get is not None:
            return bank_name_get
        else:
            return

    def get_dropdown_cc(self):
        dropdown_cc_arr = self.get_master_api_data(MasterAPIUtil.dropdown_cc,None)
        if dropdown_cc_arr is not None:
            return dropdown_cc_arr
        else:
            return list()

    def get_dropdown_bs(self):
        dropdown_bs_arr = self.get_master_api_data(MasterAPIUtil.dropdown_cc,None)
        if dropdown_bs_arr is not None:
            return dropdown_bs_arr
        else:
            return list()

    def get_grade_data_by_id(self,grade):
        data = {'1':grade}
        grade_data = self.get_master_api_data(MasterAPIUtil.get_grade_data_by_id,data)
        if grade_data is not None:
            return grade_data
        else:
            return

    def get_grade_data(self,grade):
        data = {'1':grade}
        grade_data = self.get_master_api_data(MasterAPIUtil.get_grade,data)
        if grade_data is not None:
            return grade_data
        else:
            return
    def get_grade_by_name(self,name):
        data = {'1':name}
        grade_name = self.get_master_api_data(MasterAPIUtil.get_grade_by_name,data)
        if grade_name is not None:
            return grade_name
        else:
            return

    def get_emp_list_by_id(self,emp_data):
        data = {"1":emp_data}
        emp_list = self.get_user_api_data(UserAPIUtil.get_emp_info_by_id,data)
        if emp_list is not None:
            return emp_list
        else:
            return

    def fetch_employee_role(self,emp_id,module):
        data = {'1':emp_id,'2':module}
        emp_role = self.get_user_api_data(UserAPIUtil.fetch_employee_role,data)
        if emp_role is not None:
            return emp_role
        else:
            return

    def valid_module_role(self,emp_id,module,role_arr):
        data={'1':emp_id,'2':module,'3':role_arr}
        emp_role_arr = self.get_user_api_data(UserAPIUtil.valid_module_role,data)
        if emp_role_arr is not None:
            return emp_role_arr
        else:
            return

    def valid_module(self,emp_id,module):
        data = {'1':emp_id,'2':module}
        emp_role_arr = self.get_user_api_data(UserAPIUtil.valid_module,data)
        if emp_role_arr is not None:
            return emp_role_arr
        else:
            return

    def bank_template_based_employee1(self,request,bank_id,user_id):
        data = {'1':{'month':request.GET.get('month'),'year':request.GET.get('year')},'2':bank_id,'3':user_id}
        bank_temp_emp= self.get_user_api_data(UserAPIUtil.bank_template_based_employee1,data)
        if bank_temp_emp is not None:
            return bank_temp_emp
        else:
            return

    def get_employeebankcolumns(self):
        emp_bank_cols = self.get_user_api_data(UserAPIUtil.get_employeebankcolumns,None)
        if emp_bank_cols is not None:
            return emp_bank_cols
        else:
            return

    def get_multiple_emp_dept(self,dept_arr):
        data = {'1':dept_arr}
        emp_dept_arr = self.get_user_api_data(UserAPIUtil.get_multiple_emp_dept,data)
        if emp_dept_arr is not None:
            return emp_dept_arr
        else:
            return

    def payroll_admin_role(self,find_role):
        data = {'1':find_role}
        find_role_data = self.get_user_api_data(UserAPIUtil.payroll_admin_role,data)
        if find_role_data is not None:
            return find_role_data
        else:
            return

    def emp_id_info(self,emp_id):
        data = {'1':emp_id}
        emp_data = self.get_user_api_data(UserAPIUtil.emp_id_info,data)
        if emp_data is not None:
            return emp_data
        else:
            return

    def get_empdtls_using_empcode(self,code):
        data = {'1':code}
        emp_code = self.get_user_api_data(UserAPIUtil.get_empdtls_using_empcode,data)
        if emp_code is not None:
            return emp_code
        else:
            return

    def employee_details_payroll(self,id):
        data = {'1':id}
        payroll = self.get_user_api_data(UserAPIUtil.employee_details_payroll,data)
        if payroll is not None:
            return payroll
        else:
            return

    def employee_id_get(self,emp_id):
        data = {'1':emp_id}
        emp_id_get = self.get_user_api_data(UserAPIUtil.employee_id_get,data)
        if emp_id_get is not None:
            return emp_id_get
        else:
            return

    def employee_data(self,emp_id):
        data = {'1':emp_id}
        emp_data_get = self.get_user_api_data(UserAPIUtil.employee_data,data)
        if emp_data_get is not None:
            return emp_data_get
        else:
            return

    def emp_arr_function(self,query):
        data = {'1':query}
        emp_data_get = self.get_user_api_data(UserAPIUtil.emp_arr_function,data)
        if emp_data_get is not None:
            return emp_data_get
        else:
            return

    def emp_arr_cc_bs(self,emp_cc,emp_bs):
        data = {'1':emp_cc,'2':emp_bs}
        emp_cc_bs = self.get_user_api_data(UserAPIUtil.emp_arr_cc_bs,data)
        if emp_cc_bs is not None:
            return emp_cc_bs
        else:
            return

    def emp_data_cc_bs(self,emp_id):
        data = {'1':emp_id}
        emp_data = self.get_user_api_data(UserAPIUtil.emp_data_cc_bs,data)
        if emp_data is not None:
            return emp_data
        else:
            return

    def employee_detail_arr(self,emp_id):
        data = {'1':emp_id}
        emp_arr = self.get_user_api_data(UserAPIUtil.employee_detail_arr,data)
        if emp_arr is not None:
            return emp_arr
        else:
            return

    def employee_get_value(self,emp_id):
        data = {'1':emp_id}
        emp_data = self.get_user_api_data(UserAPIUtil.employee_get_value,data)
        if emp_data is not None:
            return emp_data
        else:
            return

    def employee_overall_data(self):
        emp_data_arr = self.get_user_api_data(UserAPIUtil.employee_overall_data,None)
        if emp_data_arr is not None:
            return emp_data_arr
        else:
            return

    def grade_employee(self,emp_id,grade):
        data = {'1':emp_id,'2':grade}
        emp_grade = self.get_user_api_data(UserAPIUtil.grade_employee,data)
        if emp_grade is not None:
            return emp_grade
        else:
            return

    def employee_payrolldetails(self,emp_id_arr):
        data = {'1':emp_id_arr}
        emp_grade = self.get_user_api_data(UserAPIUtil.employee_payrolldetails,data)
        if emp_grade is not None:
            return emp_grade
        else:
            return

    def get_employeecolumns(self):
        emp_cols = self.get_user_api_data(UserAPIUtil.get_employeecolumns,None)
        if emp_cols is not None:
            return emp_cols
        else:
            return

    def get_single_emp_by_id(self,emp_id):
        data = {'1':emp_id}
        emp_dict = self.get_user_api_data(UserAPIUtil.get_single_emp_by_id,data)
        if emp_dict is not None:
            return emp_dict
        else:
            return

    def get_grade_dataframe(self,grade_dict):
        data = {'1':grade_dict}
        grade_df = self.get_master_api_data(MasterAPIUtil.get_grade_dataframe,data)
        if grade_df is not None:
            return grade_df
        else:
            return

    def get_single_user_by_id(self,emp_id):
        data = {'1':emp_id}
        emp_dict = self.get_user_api_data(UserAPIUtil.get_single_emp_by_id,data)
        if emp_dict is not None:
            return emp_dict
        else:
            return

    def scope_for_multiple_entity(self,entity_id):
        data = {'1':entity_id}
        entity_id_data = self.get_master_api_data(MasterAPIUtil.scope_for_multiple_entity,data)
        if entity_id_data is not None:
            return entity_id_data
        else:
            return

    def fetch_bank_values(self,id):
        data= {'1':id}
        bank_vals = self.get_master_api_data(MasterAPIUtil.fetch_bank_values,data)
        if bank_vals is not None:
            return bank_vals
        else:
            return

    def common_code_generate(self,code_id,emp_id):
        data = {'1':code_id,"2":emp_id}
        common_code = self.get_master_api_data(MasterAPIUtil.commoncodegen,data)
        if common_code is not None:
            return common_code
        else:
            return