/***********************************************************************************************************
 * Name         : AdvancePaymentTriggerHandler
 * Purpose      : Handler class for AdvancePaymentTrigger
 **********************************************************************************************************/
public without sharing class AdvancePaymentTriggerHandler {
    public static final String SELF = 'AdvancePayment__c';

    public static void onAfterUpdate(List<AdvancePayment__c> newList) {
        if (TriggerControl.isTriggerEnabled(SELF, TriggerOperation.AFTER_UPDATE)) {
            AdvancePaymentTriggerHelper.updateCurrentApproverNameAndId(newList);
        }
    }

    public static void onAfterInsert(List<AdvancePayment__c> newList) {
        if (TriggerControl.isTriggerEnabled(SELF, TriggerOperation.AFTER_INSERT)) {
            AdvancePaymentTriggerHelper.updateNameWithRecordId(newList);
        }
    }

    public static void onBeforeUpdate(List<AdvancePayment__c> newList, Map<Id, AdvancePayment__c> oldMap) {
        if (TriggerControl.isTriggerEnabled(SELF, TriggerOperation.BEFORE_UPDATE)) {
            AdvancePaymentTriggerHelper.validatePaymentConfirmationFields(newList, oldMap);
            AdvancePaymentTriggerHelper.preventUnallowedFieldUpdates(newList, oldMap);
            AdvancePaymentTriggerHelper.updateRejectionComment(newList);
            AdvancePaymentTriggerHelper.updateWithholdingRate(newList, oldMap);
            List<AdvancePayment__c> eligiblePaymentsForApproval = AdvancePaymentTriggerHelper.preventUpdatingOwnRecords(
                newList,
                oldMap
            );
            if (!eligiblePaymentsForApproval.isEmpty()) {
                AdvancePaymentTriggerHelper.validatePendingApprovalStatus(eligiblePaymentsForApproval, oldMap);
            }
        }
    }

    public static void onBeforeInsert(List<AdvancePayment__c> newList) {
        if (TriggerControl.isTriggerEnabled(SELF, TriggerOperation.BEFORE_INSERT)) {
            AdvancePaymentTriggerHelper.updateWithholdingRate(newList, null);
        }
    }
}
