/***********************************************************************************************************
 * Name         : FanMCAllContactsCleanupBatchHelper
 * Purpose      : Helper Class to execute the callouts to MC.
 **********************************************************************************************************/
public with sharing class FanMCAllContactsCleanupBatchHelper {
    /**
     * @description sends an API call to Marketing Cloud in batches of 5000
     * @param List<Fan_MC_Cleanup__c> list from FanMCAllContactsCleanupBatch
     * @return void
     */
    public static List<Fan_MC_Cleanup__c> sendRequests(List<Fan_MC_Cleanup__c> fanMClist, String accessToken) {
        List<Fan_MC_Cleanup__c> fansMcToUpdate;
        try {
            fansMcToUpdate = new List<Fan_MC_Cleanup__c>();
            List<String> listIdsToDelete = new List<String>();
            for (Fan_MC_Cleanup__c mcCleanup : fanMClist) {
                listIdsToDelete.add(mcCleanup.Fan_Id__c);
                mcCleanup.Delete_Request_Triggered__c = true;
            }

            String idsToDelete = String.join(listIdsToDelete, '","');
            idsToDelete = '"' + idsToDelete + '"';

            HttpRequest request = new HttpRequest();
            HttpResponse response = new HttpResponse();
            Http http = new Http();

            request.setEndpoint(ConfigUtils.getConfigString(ConfigUtils.MC_ENDPOINT_CONTACTS_DELETE));
            request.setMethod('POST');
            request.setHeader('Authorization', 'Bearer ' + accessToken);
            request.setHeader('Content-Type', 'application/json');
            request.setBody('{"values":[' + idsToDelete + '],"DeleteOperationType":"ContactAndAttributes"}');
            request.setTimeout(120000);
            response = http.send(request);

            if (response.getStatusCode() == 200) {
                DeleteRequestResponse responseObjSuccess = (DeleteRequestResponse) JSON.deserialize(
                    response.getBody(),
                    DeleteRequestResponse.class
                );
                for (Fan_MC_Cleanup__c mcCleanup : fanMClist) {
                    mcCleanup.Operation_ID__c = String.valueOf(responseObjSuccess.operationID);
                    mcCleanup.MC_Error_Message__c = null;
                }
            } else {
                if (response.getBody().contains('resultMessage')) {
                    DeleteRequestResponse responseObjError = (DeleteRequestResponse) JSON.deserialize(
                        response.getBody(),
                        DeleteRequestResponse.class
                    );
                    for (Fan_MC_Cleanup__c mcCleanup : fanMClist) {
                        mcCleanup.MC_Error_Message__c = responseObjError.resultMessage != null &&
                            !responseObjError.resultMessage.isEmpty()
                            ? responseObjError.resultMessage[0].message
                            : 'Error - no result message';
                    }
                } else {
                    ResultMessage responseObjError = (ResultMessage) JSON.deserialize(
                        response.getBody(),
                        ResultMessage.class
                    );
                    for (Fan_MC_Cleanup__c mcCleanup : fanMClist) {
                        mcCleanup.MC_Error_Message__c = responseObjError.message != null
                            ? responseObjError.message
                            : 'Error - empty message';
                    }
                }
            }
            fansMcToUpdate.addAll(fanMClist);
            return fansMcToUpdate;
        } catch (Exception ex) {
            SMELogger.logError(ex);
            fansMcToUpdate.addAll(fanMClist);
            return fansMcToUpdate;
        }
    }

    public class DeleteRequestResponse {
        public Integer operationID;
        public List<ResultMessage> resultMessage;
    }
    public class ResultMessage {
        public String message;
    }
}