/***********************************************************************************************************
 * Name         : MaximumApprovedTermsTriggerHelper
 * Purpose      : Helper methods for MaximumApprovedTermsTrigger
 **********************************************************************************************************/

public with sharing class MaximumApprovedTermsTriggerHelper {
    /**
     * @description Prevents the user from changing the CurrencyIsoCode
     * @param newList Trigger.new
     * @param oldMap Trigger.oldMap
     */
    public static void preventCurrencyChange(
        List<MaximumApprovedTerms__c> newList,
        Map<Id, MaximumApprovedTerms__c> oldMap
    ) {
        List<MaximumApprovedTerms__c> filteredMats = new List<MaximumApprovedTerms__c>();
        for (MaximumApprovedTerms__c mat : newList) {
            if (TriggerUtils.fieldHasChanged(oldMap.get(mat.Id), mat, CurrencyUtils.CURRENCY_ISO_CODE)) {
                filteredMats.add(mat);
            }
        }

        if (!filteredMats.isEmpty()) {
            Map<String, String> matCurrencyIsoCode = new Map<String, String>();
            for (Opportunity opp : [
                SELECT CurrencyIsoCode, MaximumApprovedTerms__c
                FROM Opportunity
                WHERE MaximumApprovedTerms__c IN :newList
            ]) {
                matCurrencyIsoCode.put(opp.MaximumApprovedTerms__c, opp.CurrencyIsoCode);
            }

            for (MaximumApprovedTerms__c mat : filteredMats) {
                if (mat.CurrencyIsoCode != matCurrencyIsoCode.get(mat.Id)) {
                    mat.addError(
                        CurrencyUtils.CURRENCY_ISO_CODE,
                        AWAL_Constants.VR_ERROR_MSG_CANNOT_CHANGE_MATS_CURRENCY
                    );
                }
            }
        }
    }

    /**
     * @description Checks if tracked fields have been updated and insert a history
     *  record for each one that did
     * @param newList Trigger.new
     * @param oldMap Trigger.oldMap
     */
    public static void logFieldHistory(List<MaximumApprovedTerms__c> newList, Map<Id, MaximumApprovedTerms__c> oldMap) {
        Map<String, String> fieldsToTrackMap = SchemaUtils.getFieldSetAPINames(
            SObjectType.MaximumApprovedTerms__c.FieldSets.FieldsToTrack.getFields()
        );

        List<SObject> historyRecordsToInsert = new List<SObject>();

        for (MaximumApprovedTerms__c mat : newList) {
            historyRecordsToInsert.addAll(
                HistoryTracker.createHistoryRecords(oldMap.get(mat.Id), mat, fieldsToTrackMap)
            );
        }

        if (!historyRecordsToInsert.isEmpty()) {
            insert historyRecordsToInsert;
        }
    }
}