<?php

class GridGallery_Installer_Model extends GridGallery_Core_BaseModel
{
  /**
   * Cheks whether the specified table exists.
   * @param  string $tableName Table name.
   * @return bool
   */
  public function tableExists($tableName)
  {
    $prefix = $this->db->prefix;
    $table = str_replace('{prefix}', $prefix, $tableName);

    $query = 'SHOW TABLES LIKE \'' . $table . '\'';

    $result = $this->db->get_results($query);

    return count($result) > 0 ? true : false;
  }

  /**
   * Replace {prefix} with the current database prefix.
   * @param  string $table Table name or query.
   * @return string
   */
  public function prefix($table)
  {
    return str_replace('{prefix}', $this->db->prefix, $table);
  }

  /**
   * Install plugin.
   * @param  array $queries An array of the queries.
   * @return bool
   */
  public function install($queries)
  {
    if (!is_array($queries)) {
      return false;
    }

    foreach ($queries as $table => $query) {
      if ($this->isCreateTable($table)) {
        $this->delta($this->prefix($query));
      }
    }

    return true;
  }

  /**
   * Uninstall plugin.
   * @param  array $queries An array of the queries.
   * @return bool
   */
  public function drop($queries)
  {
    if (!is_array($queries)) {
      return false;
    }

    foreach ($queries as $table => $query) {
      if ($this->isCreateTable($table)) {
        $this->dropTable($table);
      }
    }

    return true;
  }

  /**
   * Updates the database.
   * @param  array $queries An array of the queries.
   */
  public function update($queries)
  {
    foreach ($queries as $table => $query) {
      if ($this->isCreateTable($table)) {
        if (!$this->tableExists($table)) {
          $this->delta($this->prefix($query));
        }
      } else {
        $this->alterTable($table, $this->prefix($query));
      }
    }
  }

  public function isCreateTable($table)
  {
    return strpos($table, '{prefix}') === 0;
  }

  public function alterTable($params, $query)
  {
    $parts = explode(':', $params);
    if (sizeof($parts) != 3) {
      return;
    }

    if ($parts[0] == 'altercolumn') {
      $existsColumn = $this->db->get_results('Show columns from `' . str_replace('{prefix}', $this->db->prefix, $parts[2]) . '` like \'' . $parts[1] . '\'');
      if (!$this->db->last_error && (!isset($existsColumn) || !is_array($existsColumn) || sizeof($existsColumn) == 0)) {
        $this->db->query($query);
      }
    }
  }

  protected function dropTable($table)
  {
    $importantTable = [$this->prefix('{prefix}gg_photos'), $this->prefix('{prefix}gg_galleries_resources'), $this->prefix('{prefix}gg_settings_sets'), $this->prefix('{prefix}gg_galleries'), $this->prefix('{prefix}gg_tags'), $this->prefix('{prefix}gg_attributes')];
    if (!in_array($this->prefix($table), $importantTable)) {
      $query = 'DROP TABLE IF EXISTS ' . $this->prefix($table);
      $this->db->query($query);
    }
  }
}
