from datetime import timezone
from django.db.models import Q
from payrollservice.data.response.payrollprocesschangeresponse import payrollprocesschangeResponse
from payrollservice.models import Payrollprocesschange, Employeemonthly_payinfo
from payrollservice.service.auditservice import AudtiService
from payrollservice.util.payrollutil import Activestatus, Advancetype, ModifyStatus
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.nwisefinpaginator import NWisefinPaginator
from utilityservice.data.response.nwisefinsuccess import NWisefinSuccess, SuccessMessage, SuccessStatus
from utilityservice.service.applicationconstants import ApplicationNamespace
from utilityservice.service.payroll_api_service import Payrollcommon_Apicall
from utilityservice.service.threadlocal import NWisefinThread
from django.utils import timezone

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

    def payrollprocesschange_create(self, data_obj, user_id):
        from datetime import datetime
        success_obj = NWisefinSuccess()
        if not data_obj.get_id() is None:
            obj = Payrollprocesschange.objects.using(self._current_app_schema()).filter(id=data_obj.get_id()).update(employee_id=data_obj.get_employee_id(),
                                                                                                                       from_date=data_obj.get_from_date(),
                                                                                                                       to_date=data_obj.get_to_date(),
                                                                                                                       pay_change=data_obj.get_pay_change(),
                                                                                                                       reason=data_obj.get_reason(),
                                                                                                                       updated_date=timezone.now(),
                                                                                                                       updated_by=user_id)
            obj = Payrollprocesschange.objects.using(self._current_app_schema()).get(id=data_obj.get_id())
            udit_insert_data = AudtiService(self._scope()).audit_function(obj, obj.id, obj.employee_id,
                                                                          Advancetype.payrollprocessing_change,
                                                                          ModifyStatus.UPDATE)
            success_obj.set_message(SuccessMessage.UPDATE_MESSAGE)
        else:
            obj = Payrollprocesschange.objects.using(self._current_app_schema()).create(employee_id=data_obj.get_employee_id(),
                                                                                          from_date=data_obj.get_from_date(),
                                                                                          to_date=data_obj.get_to_date(),
                                                                                          pay_change=data_obj.get_pay_change(),
                                                                                          reason=data_obj.get_reason(),
                                                                                          created_by=user_id)
            audit_insert_data = AudtiService(self._scope()).audit_function(obj, obj.id, obj.employee_id,
                                                                           Advancetype.payrollprocessing_change,
                                                                           ModifyStatus.CREATE)

            success_obj.set_message(SuccessMessage.CREATE_MESSAGE)
        date = datetime.today().strftime("%Y-%m")
        current_month_year = datetime.now()
        from_date = datetime.strptime(str(obj.from_date), "%Y-%m-%d")
        from_datem = from_date.strftime("%Y-%m")
        to_date = datetime.strptime(str(obj.to_date), "%Y-%m-%d")
        to_datem = to_date.strftime("%Y-%m")
        if from_datem <= date <= to_datem:
            currentMonth = datetime.now().month
            currentYear = datetime.now().year
            data = Employeemonthly_payinfo.objects.using(self._current_app_schema()).filter(employee_id=obj.employee_id, payroll_date__month=currentMonth, payroll_date__year=currentYear).update(pay_status=obj.pay_change)
            print(data)
        return success_obj

    def payrollprocesschange_summary(self,request, vys_page):
        condition=Q(status=Activestatus.active)
        employee_id = request.GET.get('employee_id')
        from_date = request.GET.get('from_date')
        to_date = request.GET.get('to_date')
        if employee_id != None and employee_id != "":
            condition &= Q(employee_id=employee_id)
        if from_date != None and from_date != "":
            condition &= Q(from_date=from_date)
        if to_date !=None and to_date != "":
            condition &= Q(to_date=to_date)
        pro_data = Payrollprocesschange.objects.using(self._current_app_schema()).filter(condition)[vys_page.get_offset():vys_page.get_query_limit()]
        process_list = NWisefinList()
        if pro_data.count() > 0:
            for i in pro_data:
                data_obj = payrollprocesschangeResponse()
                data_obj.set_id(i.id)
                data_obj.set_from_date(i.from_date)
                data_obj.set_to_date(i.to_date)
                data_obj.set_pay_change(i.pay_change)
                data_obj.set_reason(i.reason)
                apifunction = Payrollcommon_Apicall(self._scope())
                obj = apifunction.emp_info(i.employee_id)
                data_obj.Employee_info = {"Employeename":obj.get('full_name'), "Employeecode":obj.get('code'), "Employee_id":obj.get('id'), "Employeegrade":obj.get('grade')}
                process_list.append(data_obj)
            vpage = NWisefinPaginator(pro_data, vys_page.get_index(), 10)
            process_list.set_pagination(vpage)
            return process_list
        else:
            return process_list

    def payrollprocesschange_get(self, id):
        pro_data = Payrollprocesschange.objects.using(self._current_app_schema()).filter(id=id, status=Activestatus.active)
        if pro_data.count() > 0:
            data_obj = payrollprocesschangeResponse()
            data_obj.set_id(pro_data[0].id)
            data_obj.set_from_date(pro_data[0].from_date)
            data_obj.set_to_date(pro_data[0].to_date)
            data_obj.set_pay_change(pro_data[0].pay_change)
            data_obj.set_reason(pro_data[0].reason)
            apifunction = Payrollcommon_Apicall(self._scope())
            obj = apifunction.emp_info(pro_data[0].employee_id)
            data_obj.Employee_info = {"Employeename": obj.get('full_name'), "Employeecode": obj.get('code'), "Employee_id": obj.get('id'),"Employeegrade": obj.get('grade')}
            # data_obj.set_employee_id(pro_data[0].employee_id)
            return data_obj
        else:
            data=[]
            return data

    def payrollprocesschange_inactive(self, id):
        obj = Payrollprocesschange.objects.using(self._current_app_schema()).filter(id=id).update(status=Activestatus.inactive)
        if obj == 0:
            error_obj = NWisefinError()
            error_obj.set_code(ErrorMessage.INVALID_ID)
            error_obj.set_description(ErrorDescription.INVALID)
            return error_obj
        else:
            success_obj = NWisefinSuccess()
            success_obj.set_status(SuccessStatus.SUCCESS)
            success_obj.set_message(SuccessMessage.DELETE_MESSAGE)
            return success_obj