<?php

/**
 * @file
 * Allows webform emails to be scheduled.
 */

use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\WebformInterface;
use Drupal\webform\WebformSubmissionInterface;

/**
 * Implements hook_config_schema_info_alter().
 */
function webform_scheduled_email_config_schema_info_alter(&$definitions) {
  // Append email handler to scheduled email handler settings.
  if (isset($definitions['webform.handler.email']['mapping'])
    && isset($definitions['webform.handler.scheduled_email'])) {
    $definitions['webform.handler.scheduled_email']['mapping'] += $definitions['webform.handler.email']['mapping'];
  }
}

/**
 * Implements hook_entity_update().
 */
function webform_scheduled_email_entity_update(EntityInterface $entity) {
  /** @var \Drupal\webform_scheduled_email\WebformScheduledEmailManagerInterface $webform_scheduled_email_manager */
  $webform_scheduled_email_manager = \Drupal::service('webform_scheduled_email.manager');
  $webform_scheduled_email_manager->reschedule($entity);
}

/**
 * Implements hook_entity_predelete().
 */
function webform_scheduled_email_entity_predelete(EntityInterface $entity) {
  /** @var \Drupal\webform_scheduled_email\WebformScheduledEmailManagerInterface $webform_scheduled_email_manager */
  $webform_scheduled_email_manager = \Drupal::service('webform_scheduled_email.manager');
  $webform_scheduled_email_manager->unschedule($entity);
}

/**
 * Implements hook_ENTITY_TYPE_delete() for webform entities.
 */
function webform_scheduled_email_webform_delete(WebformInterface $webform) {
  /** @var \Drupal\webform_scheduled_email\WebformScheduledEmailManagerInterface $webform_scheduled_email_manager */
  $webform_scheduled_email_manager = \Drupal::service('webform_scheduled_email.manager');
  $webform_scheduled_email_manager->delete($webform);
}

/**
 * Implements hook_ENTITY_TYPE_delete() for webform_submission entities.
 */
function webform_scheduled_email_webform_submission_delete(WebformSubmissionInterface $webform_submission) {
  /** @var \Drupal\webform_scheduled_email\WebformScheduledEmailManagerInterface $webform_scheduled_email_manager */
  $webform_scheduled_email_manager = \Drupal::service('webform_scheduled_email.manager');
  $webform_scheduled_email_manager->delete($webform_submission);
}

/**
 * Implements hook_cron().
 */
function webform_scheduled_email_cron() {
  /** @var \Drupal\webform_scheduled_email\WebformScheduledEmailManagerInterface $webform_scheduled_email_manager */
  $webform_scheduled_email_manager = \Drupal::service('webform_scheduled_email.manager');
  $webform_scheduled_email_manager->cron();
}

/**
 * Implements hook_theme().
 */
function webform_scheduled_email_theme() {
  return [
    'webform_handler_scheduled_email_summary' => [
      'variables' => ['settings' => NULL, 'handler' => [], 'status' => NULL],
    ],
  ];
}

/**
 * Implements hook_form_FORM_ID_alter() for webform admin config handlers form.
 */
function webform_scheduled_email_form_webform_admin_config_handlers_form_alter(&$form, FormStateInterface $form_state) {
  $form['webform_scheduled_email'] = [
    '#type' => 'details',
    '#title' => t('Scheduled email settings'),
    '#open' => TRUE,
    '#tree' => TRUE,
  ];
  $form['webform_scheduled_email']['schedule_type'] = [
    '#type' => 'select',
    '#title' => t('Date type'),
    '#description' => t('Scheduled emails are queued and sent via hourly <a href="@href">cron tasks</a>. To schedule an email for a specific time, site administrators must increase the cron task execution frequency.', ['@href' => 'https://www.drupal.org/docs/8/cron-automated-tasks/cron-automated-tasks-overview']),
    '#options' => [
      'date' => t('Date (@format)', ['@format' => 'YYYY-MM-DD']),
      'datetime' => t('Date/time (@format)', ['@format' => 'YYYY-MM-DD HH:MM:SS']),
    ],
    '#required' => TRUE,
    '#default_value' => \Drupal::config('webform_scheduled_email.settings')->get('schedule_type'),
  ];

  $form['#submit'][] = '_webform_scheduled_email_form_webform_admin_config_handlers_form_submit';
}

/**
 * Submit callback for Scheduled email settings.
 */
function _webform_scheduled_email_form_webform_admin_config_handlers_form_submit(&$form, FormStateInterface $form_state) {
  $values = $form_state->getValue('webform_scheduled_email');
  \Drupal::configFactory()
    ->getEditable('webform_scheduled_email.settings')
    ->set('schedule_type', $values['schedule_type'])
    ->save();
}
