/***********************************************************************************************************
 * Name         : FanDeleteUtils
 * Purpose      : Utility class containing logic shared by all Fan Delete processes
 **********************************************************************************************************/
public with sharing class FanDeleteUtils {
    /**
     * @description creates PC_DeleteRequest__c
     * @param  Map<Id, String> mapFanIdFanEmail
     * @param  List<Form_Response__c> formResponsesToDelete
     * @return List of PC_DeleteRequest__c to insert
     */
    public static List<PC_DeleteRequest__c> createPcDeleteRecords(
        Map<Id, String> mapFanIdFanEmail,
        List<Form_Response__c> formResponsesToDelete
    ) {
        List<PC_DeleteRequest__c> pcDeleteRequests = new List<PC_DeleteRequest__c>();
        Map<Id, List<Form_Response__c>> mapFanFRs = new Map<Id, List<Form_Response__c>>();
        Date pcDeleteAEDate = Date.valueOf(ConfigUtils.getConfigString(ConfigUtils.PC_DELETE_AE_DATE));

        for (Form_Response__c formResponse : [
            SELECT CreatedDate, Email__c, Fan_ID__c, Fan_ID__r.Email__c, Form_ID__c, Form_ID__r.Form_Tool_Name__c, Id
            FROM Form_Response__c
            WHERE Fan_ID__c = :mapFanIdFanEmail.keySet()
        ]) {
            formResponsesToDelete.add(formResponse);
            List<Form_Response__c> formResponses = mapFanFRs.get(formResponse.Fan_ID__c);
            if (formResponses != null) {
                formResponses.add(formResponse);
                mapFanFRs.put(formResponse.Fan_ID__c, formResponses);
            } else {
                mapFanFRs.put(formResponse.Fan_ID__c, new List<Form_Response__c>{ formResponse });
            }
        }
        for (Id fanId : mapFanFRs.keySet()) {
            PC_DeleteRequest__c pcDeleteRequest = new PC_DeleteRequest__c();
            for (Form_Response__c formResponse : mapFanFRs.get(fanId)) {
                pcDeleteRequest.Email__c = String.isBlank(formResponse.Email__c)
                    ? mapFanIdFanEmail.get(fanId)
                    : formResponse.Email__c;
                String source = formResponse.Form_ID__r.Form_Tool_Name__c;
                if (
                    (source == UtilConstants.SOURCE_FORM_TOOL_WORDPRESS ||
                    source == UtilConstants.SOURCE_FORM_TOOL_SMF ||
                    source == null) && formResponse.CreatedDate > pcDeleteAEDate
                ) {
                    pcDeleteRequest.AE__c = true;
                } else if (
                    source == UtilConstants.SOURCE_FORM_TOOL_WYNG ||
                    source == UtilConstants.SOURCE_FORM_TOOL_OFFERPOP
                ) {
                    pcDeleteRequest.Wyng__c = true;
                    if (formResponse.CreatedDate > pcDeleteAEDate) {
                        pcDeleteRequest.AE__c = true;
                    }
                } else if (source == UtilConstants.SOURCE_FORM_TOOL_MTL) {
                    pcDeleteRequest.MTL__c = true;
                } else if (source == UtilConstants.SOURCE_FORM_TOOL_TUNESPEAK) {
                    pcDeleteRequest.Tunespeak__c = true;
                    pcDeleteRequest.AE__c = true;
                }
            }
            if (
                !String.isBlank(pcDeleteRequest.Email__c) &&
                (pcDeleteRequest.AE__c ||
                pcDeleteRequest.Wyng__c ||
                pcDeleteRequest.MTL__c ||
                pcDeleteRequest.Tunespeak__c)
            ) {
                pcDeleteRequests.add(pcDeleteRequest);
            }
        }

        return pcDeleteRequests;
    }

    /**
     * @description Creates PC_DeleteRequest__c based on SnowflakeFormResponseWrappers
     * @param  List<SnowflakeFormResponseWrapper> formrRsponseWrappers
     * @return List of PC_DeleteRequest__c to insert
     */
    public static List<PC_DeleteRequest__c> createPcDeleteRecords(
        List<SnowflakeFormResponseWrapper> formrRsponseWrappers
    ) {
        List<PC_DeleteRequest__c> pcDeleteRequests = new List<PC_DeleteRequest__c>();
        Map<Id, List<SnowflakeFormResponseWrapper>> mapFanFRs = new Map<Id, List<SnowflakeFormResponseWrapper>>();
        Date pcDeleteAEDate = Date.valueOf(ConfigUtils.getConfigString(ConfigUtils.PC_DELETE_AE_DATE));

        for (SnowflakeFormResponseWrapper SnowflakeFormResponseWrapper : formrRsponseWrappers) {
            List<SnowflakeFormResponseWrapper> formResponses = mapFanFRs.get(SnowflakeFormResponseWrapper.fanId);
            if (formResponses != null) {
                formResponses.add(SnowflakeFormResponseWrapper);
                mapFanFRs.put(SnowflakeFormResponseWrapper.fanId, formResponses);
            } else {
                mapFanFRs.put(
                    SnowflakeFormResponseWrapper.fanId,
                    new List<SnowflakeFormResponseWrapper>{ SnowflakeFormResponseWrapper }
                );
            }
        }
        for (Id fanId : mapFanFRs.keySet()) {
            PC_DeleteRequest__c pcDeleteRequest = new PC_DeleteRequest__c();
            for (SnowflakeFormResponseWrapper formResponse : mapFanFRs.get(fanId)) {
                pcDeleteRequest.Email__c = String.isNotBlank(formResponse.frEmail)
                    ? formResponse.frEmail
                    : formResponse.fanEmail;
                String source = formResponse.formToolName;
                if (
                    (source == UtilConstants.SOURCE_FORM_TOOL_WORDPRESS ||
                    source == UtilConstants.SOURCE_FORM_TOOL_SMF ||
                    source == null) && formResponse.createdDate > pcDeleteAEDate
                ) {
                    pcDeleteRequest.AE__c = true;
                } else if (
                    source == UtilConstants.SOURCE_FORM_TOOL_WYNG ||
                    source == UtilConstants.SOURCE_FORM_TOOL_OFFERPOP
                ) {
                    pcDeleteRequest.Wyng__c = true;
                    if (formResponse.CreatedDate > pcDeleteAEDate) {
                        pcDeleteRequest.AE__c = true;
                    }
                } else if (source == UtilConstants.SOURCE_FORM_TOOL_MTL) {
                    pcDeleteRequest.MTL__c = true;
                } else if (source == UtilConstants.SOURCE_FORM_TOOL_TUNESPEAK) {
                    pcDeleteRequest.Tunespeak__c = true;
                    pcDeleteRequest.AE__c = true;
                }
            }
            if (
                !String.isBlank(pcDeleteRequest.Email__c) &&
                (pcDeleteRequest.AE__c ||
                pcDeleteRequest.Wyng__c ||
                pcDeleteRequest.MTL__c ||
                pcDeleteRequest.Tunespeak__c)
            ) {
                pcDeleteRequests.add(pcDeleteRequest);
            }
        }

        return pcDeleteRequests;
    }
}
