<?php
use CRM_FormProcessor_ExtensionUtil as E;

/**
 * Collection of upgrade steps.
 */
class CRM_FormProcessor_Upgrader extends CRM_FormProcessor_Upgrader_Base {

  public function install() {
    $this->executeSqlFile('sql/create_civicrm_form_processor.sql');
  }

  public function upgrade_1001() {
    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_form_processor_action` ADD COLUMN `condition_configuration` TEXT NULL AFTER `mapping`");
    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_form_processor_default_data_action` ADD COLUMN `condition_configuration` TEXT NULL AFTER `mapping`");
    return TRUE;
  }

  public function upgrade_1002() {
    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_form_processor_input` ADD COLUMN `title` VARCHAR(128) NULL AFTER `form_processor_instance_id`");
    CRM_Core_DAO::executeQuery("UPDATE `civicrm_form_processor_input` SET `title` = `name`");
    return true;
  }

  public function upgrade_1003() {
    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_form_processor_action`
      ADD COLUMN `delay` VARCHAR(255) NULL,
      ADD COLUMN `delay_configuration` TEXT NULL");
    return TRUE;
  }

  public function upgrade_1004() {
    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_form_processor_default_data_input` ADD COLUMN `title` VARCHAR(128) NULL AFTER `form_processor_instance_id`");
    return TRUE;
  }

  public function upgrade_1005() {
    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_form_processor_input` ADD COLUMN `weight` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `form_processor_instance_id`");
    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_form_processor_default_data_input` ADD COLUMN `weight` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `form_processor_instance_id`");
    CRM_Core_DAO::executeQuery("UPDATE `civicrm_form_processor_input` SET `weight` = `id`");
    CRM_Core_DAO::executeQuery("UPDATE `civicrm_form_processor_default_data_input` SET `weight` = `id`");
    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_form_processor_input` ADD COLUMN `include_formatted_params` TINYINT NULL DEFAULT 1 AFTER `weight`");
    CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_form_processor_default_data_input` ADD COLUMN `include_formatted_params` TINYINT NULL DEFAULT 1 AFTER `weight`");
    return TRUE;
  }

  /**
   * Example: Work with entities usually not available during the install step.
   *
   * This method can be used for any post-install tasks. For example, if a step
   * of your installation depends on accessing an entity that is itself
   * created during the installation (e.g., a setting or a managed entity), do
   * so here to avoid order of operation problems.
   *
  public function postInstall() {
    $customFieldId = civicrm_api3('CustomField', 'getvalue', array(
      'return' => array("id"),
      'name' => "customFieldCreatedViaManagedHook",
    ));
    civicrm_api3('Setting', 'create', array(
      'myWeirdFieldSetting' => array('id' => $customFieldId, 'weirdness' => 1),
    ));
  }*/

  public function uninstall() {
    $config = \CRM_Core_Config::singleton();
    $directoryName = $config->customFileUploadDir . 'FormProcessor';
    \CRM_Utils_File::cleanDir($directoryName, TRUE);
    $this->executeSqlFile('sql/uninstall.sql');
  }

  /**
   * Look up extension dependency error messages and display as Core Session Status
   *
   * @param array $unmet
   */
  public static function displayDependencyErrors(array $unmet){
    foreach ($unmet as $ext) {
      $message = self::getUnmetDependencyErrorMessage($ext);
      CRM_Core_Session::setStatus($message, E::ts('Prerequisite check failed.'), 'error');
    }
  }

  /**
   * Mapping of extensions names to localized dependency error messages
   *
   * @param string $unmet an extension name
   */
  public static function getUnmetDependencyErrorMessage($unmet) {
    switch ($unmet[0]) {
      case 'action-provider':
        return ts('Form Processor was installed successfully, but you must also install and enable the <a href="%1">action-provider Extension</a> version %2 or newer.', array(1 => 'https://lab.civicrm.org/extensions/action-provider', 2=>$unmet[1]));
    }

    CRM_Core_Error::fatal(ts('Unknown error key: %1', array(1 => $unmet)));
  }

  /**
   * Extension Dependency Check
   *
   * @return Array of names of unmet extension dependencies; NOTE: returns an
   *         empty array when all dependencies are met.
   */
  public static function checkExtensionDependencies() {
    $manager = CRM_Extension_System::singleton()->getManager();

    $dependencies = array(
      ['action-provider', '1.61']
    );

    $unmet = array();
    foreach($dependencies as $ext) {
      if (!self::checkExtensionVersion($ext[0], $ext[1])) {
        array_push($unmet, $ext);
      }
    }
    return $unmet;
  }

  public static function checkExtensionVersion($extension, $version) {
    try {
      static $extensions = null;
      if (!$extensions) {
        $extensions = civicrm_api3('Extension', 'get', array('options' => array('limit' => 0)));
      }
      foreach($extensions['values'] as $ext) {
        if ($ext['key'] == $extension && $ext['status'] == 'installed') {
          if (version_compare($ext['version'], $version, '>=')) {
            return true;
          }
        }
      }
    }
    catch (Exception $e) {
      return FALSE;
    }
    return FALSE;
  }

}
