/***********************************************************************************************************
 * Name         : SubscriptionTriggerHelper
 * Purpose      : Implementation for methods called by SubscriptionTriggerHandler
 **********************************************************************************************************/
public with sharing class SubscriptionTriggerHelper {
    /**
     * @description insertSubscriptionHistory creates a new Subscription history for each new subscription.
     * @param  subNewList Trigger.new from SubscriptionTrigger
     */
    public static void insertSubscriptionHistory(List<Subscription__c> subNewList) {
        List<Subscription_History__c> subHistoriesToInsert = new List<Subscription_History__c>();
        Map<Id, Id> mapMLTla = new Map<Id, Id>();
        Set<Id> subsML = new Set<Id>();

        for (Subscription__c sub : subNewList) {
            subsML.add(sub.Mailing_List_ID__c);
        }

        for (Mailing_List__c mailingList : [SELECT Id, TLA_ID__c FROM Mailing_List__c WHERE Id IN :subsML]) {
            mapMLTla.put(mailingList.Id, mailingList.TLA_ID__c);
        }

        for (Subscription__c sub : subNewList) {
            Subscription_History__c subHistory = new Subscription_History__c();
            subHistory.Fan_ID__c = sub.Fan_ID__c;
            subHistory.Action__c = UtilConstants.SH_ACTION_SIGN_UP;
            subHistory.Expiration_Date__c = null;
            subHistory.Mailing_List_ID__c = sub.Mailing_List_ID__c;
            subHistory.Subscription_ID__c = sub.id;
            subHistory.Promo_ID__c = sub.Promo_ID__c;
            subHistory.TLA_ID__c = mapMLTla.get(sub.Mailing_List_ID__c);
            subHistory.Source__c = sub.Source__c;
            subHistory.DSP__c = sub.DSP__c;
            subHistory.Form_ID__c = sub.Form_ID__c;
            if(sub.Source__c != UtilConstants.FILE_UPLOAD_TOOL){
                subHistory.Preferred_Genre__c = sub.Preferred_Genre__c;
            }
            subHistory.Is_Crm_Generated__c = sub.Is_Crm_Generated__c;
            subHistoriesToInsert.add(subHistory);
        }
        insert subHistoriesToInsert;
    }
}