/***********************************************************************************************************
 * Name         : AP_ApprovalReminderEmailBatch
 * Purpose      : Batch job to send reminder emails to approvers
 **********************************************************************************************************/
public without sharing class AP_ApprovalReminderEmailBatch implements Database.Batchable<SObject>, Schedulable {
    public static final String APPROVAL_EMAIL_REMINDER_CRON_EXPS = 'APPROVAL_EMAIL_REMINDER_CRON_EXPS';

    public Database.queryLocator start(Database.BatchableContext BC) {
        String query =
            'SELECT Id, ActorId, Actor.Name, Actor.Email, ProcessInstance.TargetObjectId, ' +
            'ProcessInstance.LastModifiedDate FROM ProcessInstanceWorkitem WHERE ' +
            'ProcessInstance.TargetObject.Type = \'AdvancePayment__c\' AND ProcessInstance.Status = \'Pending\' ORDER BY ActorId';
        return Database.getQueryLocator(query);
    }

    public void execute(Database.BatchableContext BC, List<ProcessInstanceWorkitem> pendingWorkItems) {
        try {
            List<Messaging.SingleEmailMessage> emailsList = AP_ApprovalReminderEmailBatchHelper.getListOfEmails(
                pendingWorkItems
            );

            Messaging.sendEmail(emailsList);
        } catch (Exception ex) {
            ErrorLogger.logError(ex);
        }
    }

    public void finish(Database.BatchableContext BC) {
    }

    public void execute(SchedulableContext sc) {
        Database.executeBatch(new AP_ApprovalReminderEmailBatch(), 2000);
    }

    public static void schedule() {
        BatchJobUtils.scheduleJob(
            new AP_ApprovalReminderEmailBatch(),
            ConfigUtils.getConfigString(APPROVAL_EMAIL_REMINDER_CRON_EXPS)
        );
    }
}
