/***********************************************************************************************************
 * Name         : TempFormResponseBatchMonitor
 * Purpose      : Monitors TempFormResponseBatch and starts it if it is not running
 **********************************************************************************************************/

public with sharing class TempFormResponseBatchMonitor implements Schedulable {
    public void monitor() {
        List<AsyncApexJob> jobs = Database.query(BatchJobUtils.getMonitorQuery('TempFormResponseBatch'));
        for (AsyncApexJob job : jobs) {
            if (BatchJobUtils.ACTIVE_JOB_STATUS.contains(job.Status)) {
                return;
            }
            if (
                job.CreatedDate >
                System.now().addMinutes(-ConfigUtils.getConfigInt(ConfigUtils.TFR_MONITOR_CREATED_MINUTES))
            ) {
                return;
            }
        }

        Database.executeBatch(new TempFormResponseBatch());
        Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();
        email.setToAddresses(ConfigUtils.getConfigMultipleStrings(ConfigUtils.TFR_MONITOR_EMAIL_RECIPIENTS));
        email.setSenderDisplayName(ConfigUtils.getConfigString(ConfigUtils.TFR_MONITOR_EMAIL_SENDER));
        email.setSubject(ConfigUtils.getConfigString(ConfigUtils.TFR_MONITOR_EMAIL_SUBJECT));
        List<String> bodies = ConfigUtils.getConfigMultipleStrings(ConfigUtils.TFR_MONITOR_EMAIL_BODIES);

        if (!jobs.isEmpty()) {
            Messaging.EmailFileAttachment csvAttc = new Messaging.EmailFileAttachment();
            Blob csvBlob = FormatUtils.createCsvBlobFromSObjectList(jobs);
            csvAttc.setFileName('Jobs.csv');
            csvAttc.setBody(csvBlob);
            email.setFileAttachments(new List<Messaging.EmailFileAttachment>{ csvAttc });
            email.setPlainTextBody(bodies[0]);
        } else {
            email.setPlainTextBody(bodies[1]);
        }
        Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{ email });
    }

    public void execute(SchedulableContext sc) {
        this.monitor();
    }

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