<?php

/**
 * @file
 * Drush interface to l10n-update functionalities.
 */

/**
 * Implements hook_drush_command().
 */
function l10n_update_drush_command() {
  $commands = array();
  $commands['l10n-update-refresh'] = array(
    'description' => 'Refresh available information.',
  );
  $commands['l10n-update-status'] = array(
    'description' => 'Show translation status of available projects.',
    'options' => array(
      'languages' => 'Comma separated list of languages. Defaults to all available languages.',
    )
  );
  $commands['l10n-update'] = array(
    'description' => 'Update translations.',
    'options' => array(
      'languages' => 'Comma separated list of languages. Defaults to all available languages.',
      'mode' => 'Allowed values: overwrite, keep. Default value: keep.'
    ),
  );
  return $commands;
}

/**
 * Callback for command l10n-update-refresh.
 */
function drush_l10n_update_refresh() {
  module_load_include('admin.inc', 'l10n_update');

  // Fake $form_state to leverage _submit function.
  $form_state = array(
    'values' => array('op' => t('Refresh information'))
  );
  l10n_update_admin_import_form_submit(NULL, $form_state);
}

/**
 * Validate command l10n-update-status.
 */
function drush_l10n_update_status_validate() {
  _drush_l10n_update_validate_languages();
}

/**
 * Callback for command l10n-update-status.
 */
function drush_l10n_update_status() {
  $updates = _drush_l10n_update_get_updates();
  if (!is_null($updates)) {
    $languages = drush_get_option('languages');
    // Table header.
    $table = array();
    $header = array(dt('Project'));
    foreach ($languages as $lang => $language) {
      $header[] = $language . ' status';
    }
    $table[] = $header;
    // Iterate projects to obtain per language status.
    $projects = l10n_update_get_projects();
    $history = l10n_update_get_history();
    foreach ($projects as $name => $project) {
      $row = array();
      // Project.
      $title = isset($project->title) ? $project->title : $project->name;
      $row[] = $title . ' ' . $project->version;
      // Language status.
      foreach ($languages as $lang => $language) {
        $current = isset($history[$name][$lang]) ? $history[$name][$lang] : NULL;
        $update = isset($updates[$name][$lang]) ? $updates[$name][$lang] : NULL;
        if ($update) {
          $row[] = ($update->type == 'download') ? t('Remote update available'):t('Local update available');
        }
        elseif ($current) {
          $row[] = t('Up to date');
        }
        else {
          $row[] = t('No information');
        }
      }
      $table[] = $row;
    }
    drush_print_table($table, TRUE);
  }
  else {
    drush_log(dt('No projects or languages to update.'), 'ok');
  }
}

/**
 * Validate command l10n-update.
 */
function drush_l10n_update_validate() {
  _drush_l10n_update_validate_languages();

  // Check provided update mode is valid.
  $mode = drush_get_option('mode', 'keep');
  if (!in_array($mode, array('keep', 'overwrite'))) {
    return drush_set_error('L10N_UPDATE_INVALID_MODE', dt('Invalid update mode. Valid options are keep, overwrite.'));
  }
}

/**
 * Callback for command l10n-update.
 */
function drush_l10n_update() {
  $updates = _drush_l10n_update_get_updates();
  if (!is_null($updates)) {
    if (count($updates) > 0) {
      drush_log(dt('Found @count projects to update.', array('@count' => count($updates))), 'status');

      // Batch update all projects for selected languages.
      $mode = drush_get_option('mode', 'keep');
      $languages = drush_get_option('languages');
      module_load_include('batch.inc', 'l10n_update');
      $updates = _l10n_update_prepare_updates($updates, NULL, array_keys($languages));
      $batch = l10n_update_batch_multiple($updates, $mode);
      drush_log($batch['title'], 'status');
      drush_log($batch['init_message'], 'status');
      batch_set($batch);
      drush_backend_batch_process();
    }
    else {
      drush_log(dt('All translations up to date'), 'status');
    }
  }
}

/**
 * Helper function to validate languages.
 *
 * Used by _validate hooks.
 *  1. Check other languages than english are available.
 *  2. Check user provided languages are valid.
 */
function _drush_l10n_update_validate_languages() {
  // Check there're installed other languages than english.
  $installed_languages = l10n_update_language_list();
  if (empty($installed_languages)) {
    return drush_set_error('L10N_UPDATE_NO_LANGUAGES', dt('No languages to update.'));
  }
  // Check provided languages are valid.
  $languages = drush_get_option('languages', '');
  $languages = array_map('trim', _convert_csv_to_array($languages));
  if (count($languages)) {
    foreach ($languages as $key => $lang) {
      if (!isset($installed_languages[$lang])) {
        drush_set_error('L10N_UPDATE_INVALID_LANGUAGE', dt('Language @lang is not installed.', array('@lang' => $lang)));
      }
      else {
        unset($languages[$key]);
        $languages[$lang] = $installed_languages[$lang];
      }
    }
    if (drush_get_error() != DRUSH_SUCCESS) {
      drush_print(dt('Available languages: @languages', array('@languages' => implode(', ', array_keys($installed_languages)))));
    }
  }
  else {
    $languages = $installed_languages;
  }
  drush_set_option('languages', $languages);
}

/**
 * Helper function to obtain $updates.
 *
 * @return $updates array or NULL.
 */
function _drush_l10n_update_get_updates() {
  $projects = l10n_update_get_projects();
  if ($projects) {
    $history = l10n_update_get_history();
    drush_log(dt('Fetching update information for all projects / all languages.'), 'status');
    module_load_include('check.inc', 'l10n_update');
    $available = l10n_update_available_releases();
    $updates = l10n_update_build_updates($history, $available);
    return $updates;
  }
  else {
    drush_log(dt('No projects or languages to update.'), 'ok');
  }
}
