/***********************************************************************************************************
 * Name         : FanMCAllContactsVerificationHelper
 * Purpose      : Helper Class to execute the callouts to MC.
 **********************************************************************************************************/
public with sharing class FanMCAllContactsVerificationHelper {
    public static final String OP_ID_NOT_FOUND_MESSAGE = 'The referenced OperationID was not found.';

    /**
     * @description segregates the FanMCs into groups of OperationId
     * @param Fan_MC_Cleanup__c List from WelcomeEmailBatch scope
     * @return Map<String, List<SObject>> map grouping the FanMCs by OperationID
     */
    public static Map<String, List<SObject>> groupByOperationId(List<Fan_MC_Cleanup__c> fanMCs) {
        Map<String, List<Fan_MC_Cleanup__c>> opIdFanMCsMap = new Map<String, List<Fan_MC_Cleanup__c>>();

        for (Fan_MC_Cleanup__c fanMc : fanMCs) {
            String operationId = fanMc.Operation_ID__c;

            if (opIdFanMCsMap.containsKey(operationId)) {
                opIdFanMCsMap.get(operationId).add(fanMc);
            } else {
                opIdFanMCsMap.put(operationId, new List<Fan_MC_Cleanup__c>{ fanMc });
            }
        }
        return opIdFanMCsMap;
    }

    /**
     * @description performs callouts for each operation ID
     * @param String OperationId related to multiple FanMcs
     * @param List<Fan_MC_Cleanup__c> FanMCs list related to the specific OperationId
     * @return String accessToken to authorize the callouts
     */
    public static void performVerificationCallout(
        String operationId,
        List<Fan_MC_Cleanup__c> groupedFanMcs,
        String accessToken
    ) {
        try {
            HttpRequest request = new HttpRequest();
            HttpResponse response = new HttpResponse();
            Http http = new Http();
            request.setEndpoint(
                ConfigUtils.getConfigString(ConfigUtils.MC_ENDPOINT_CONTACTS_DELETE_STATUS) + operationId
            );
            request.setMethod('GET');
            request.setHeader('Authorization', 'Bearer ' + accessToken);
            request.setHeader('Content-Type', 'application/json');
            request.setTimeout(120000);
            response = http.send(request);
            String responseBody = response.getBody();

            if (response.getStatusCode() == 200) {
                VerificationResponse verificationResponse = new VerificationResponse();
                verificationResponse = (VerificationResponse) JSON.deserialize(
                    responseBody,
                    VerificationResponse.class
                );

                for (Fan_MC_Cleanup__c fanMc : groupedFanMcs) {
                    fanMc.TimesChecked__c++;

                    fanMc.MC_Error_Message__c = verificationResponse.ResultMessages != null &&
                        !verificationResponse.ResultMessages.isEmpty()
                        ? verificationResponse.ResultMessages[0].message
                        : null;
                    if (fanMc.MC_Error_Message__c == OP_ID_NOT_FOUND_MESSAGE) {
                        fanMc.Status__c = 'OperationID not found';
                    } else {
                        fanMc.Status__c = verificationResponse.backgroundOperationsSummary != null &&
                            !verificationResponse.backgroundOperationsSummary.isEmpty()
                            ? verificationResponse.backgroundOperationsSummary[0].backgroundOperationStatusID
                            : 'Processing';
                    }
                    fanMc.Is_Deleted_From_MC_All_Subscribers__c = fanMc.Status__c == 'Completed' ? true : false;
                }
            } else {
                ResultMessage responseObjError = (ResultMessage) JSON.deserialize(responseBody, ResultMessage.class);
                for (Fan_MC_Cleanup__c fanMc : groupedFanMcs) {
                    fanMc.TimesChecked__c++;
                    fanMc.MC_Error_Message__c = responseObjError.message != null
                        ? responseObjError.message
                        : 'Error - empty message';
                }
            }
        } catch (Exception ex) {
            for (Fan_MC_Cleanup__c fanMc : groupedFanMcs) {
                fanMc.TimesChecked__c++;
                fanMc.MC_Error_Message__c = ex.getMessage();
            }
            SMELogger.logError(ex);
        }
    }

    public class ResultMessage {
        public String message;
    }
    public class VerificationResponse {
        public Operation operation;
        public BackgroundOperationsSummary[] backgroundOperationsSummary;
        public ResultMessages[] resultMessages;
        public boolean hasErrors;
    }
    public class Operation {
        public String status;
    }
    public class BackgroundOperationsSummary {
        public String backgroundOperationStatusID;
    }
    public class ResultMessages {
        public String message;
    }
}
