/***********************************************************************************************************
 * Name         : CA_OpportunityTriggerHandler
 * Purpose      : Opportunity Handler for CA
 **********************************************************************************************************/
public with sharing class CA_OpportunityTriggerHandler {
    public static void onBeforeInsert(List<Opportunity> newList) {
        CA_OpportunityTriggerHelper.validateOneActiveOpportunityPerAccount(newList, null);
        CA_OpportunityTriggerHelper.syncDataBetweenAccountAndOpp(newList, null);
    }

    public static void onAfterInsert(List<Opportunity> newList) {
        CA_OpportunityTriggerHelper.loadServiceTracker(newList);
    }

    public static void onBeforeUpdate(List<Opportunity> newList, Map<Id, Opportunity> oldMap) {
        CA_OpportunityTriggerHelper.validateOneActiveOpportunityPerAccount(newList, oldMap);
        FieldVisibilityDependency.handleFieldVisibilityDependencies(
            newList,
            oldMap,
            CA_Constants.FIELD_VISIBILITY_DEPENDENCIES
        );
        CA_OpportunityTriggerHelper.preventAdvanceRequiredAndStageChange(newList, oldMap);
        CA_OpportunityTriggerHelper.validateRequiredFieldsByStage(newList);
        CA_OpportunityTriggerHelper.checkLabelId(newList, oldMap);
        CA_OpportunityTriggerHelper.createOrDeleteProjecedPerformance(newList, oldMap);
    }

    public static void onAfterUpdate(List<Opportunity> newList, Map<Id, Opportunity> oldMap) {
        CA_OpportunityTriggerHelper.logFieldHistory(newList, oldMap);
        CA_OpportunityTriggerHelper.syncDataBetweenAccountAndOpp(newList, oldMap);
        CA_OpportunityTriggerHelper.sendEmailToRM(newList, oldMap);
        CA_OpportunityTriggerHelper.clearUnavailableServicesOnOppComplete(newList, oldMap);
    }
}