<?php
/*
* 2007-2016 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <contact@prestashop.com>
*  @copyright  2007-2016 PrestaShop SA
*  @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*/

class ImageTypeCore extends ObjectModel
{
    public $id;

    /** @var string Name */
    public $name;

    /** @var int Width */
    public $width;

    /** @var int Height */
    public $height;

    /** @var bool Apply to products */
    public $products;

    /** @var int Apply to categories */
    public $categories;

    /** @var int Apply to manufacturers */
    public $manufacturers;

    /** @var int Apply to suppliers */
    public $suppliers;

    /** @var int Apply to scenes */
    public $scenes;

    /** @var int Apply to store */
    public $stores;

    /**
     * @see ObjectModel::$definition
     */
    public static $definition = array(
        'table' => 'image_type',
        'primary' => 'id_image_type',
        'fields' => array(
            'name' =>        array('type' => self::TYPE_STRING, 'validate' => 'isImageTypeName', 'required' => true, 'size' => 64),
            'width' =>        array('type' => self::TYPE_INT, 'validate' => 'isImageSize', 'required' => true),
            'height' =>        array('type' => self::TYPE_INT, 'validate' => 'isImageSize', 'required' => true),
            'categories' =>    array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
            'products' =>        array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
            'manufacturers' =>    array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
            'suppliers' =>        array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
            'scenes' =>        array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
            'stores' =>        array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
        ),
    );

    /**
     * @var array Image types cache
     */
    protected static $images_types_cache = array();

    protected static $images_types_name_cache = array();

    protected $webserviceParameters = array();

    /**
     * Returns image type definitions
     *
     * @param string|null Image type
     * @param bool        $order_by_size
     * @return array Image type definitions
     * @throws PrestaShopDatabaseException
     */
    public static function getImagesTypes($type = null, $order_by_size = false)
    {
        if (!isset(self::$images_types_cache[$type])) {
            $where = 'WHERE 1';
            if (!empty($type)) {
                $where .= ' AND `'.bqSQL($type).'` = 1 ';
            }

            if ($order_by_size) {
                $query = 'SELECT * FROM `'._DB_PREFIX_.'image_type` '.$where.' ORDER BY `width` DESC, `height` DESC, `name`ASC';
            } else {
                $query = 'SELECT * FROM `'._DB_PREFIX_.'image_type` '.$where.' ORDER BY `name` ASC';
            }

            self::$images_types_cache[$type] = Db::getInstance()->executeS($query);
        }
        return self::$images_types_cache[$type];
    }

    /**
    * Check if type already is already registered in database
    *
    * @param string $typeName Name
    * @return int Number of results found
    */
    public static function typeAlreadyExists($type_name)
    {
        if (!Validate::isImageTypeName($type_name)) {
            die(Tools::displayError());
        }

        Db::getInstance()->executeS('
			SELECT `id_image_type`
			FROM `'._DB_PREFIX_.'image_type`
			WHERE `name` = \''.pSQL($type_name).'\'');

        return Db::getInstance()->NumRows();
    }

    /**
     * Finds image type definition by name and type
     * @param string $name
     * @param string $type
     */
    public static function getByNameNType($name, $type = null, $order = 0)
    {
        static $is_passed = false;

        if (!isset(self::$images_types_name_cache[$name.'_'.$type.'_'.$order]) && !$is_passed) {
            $results = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'image_type`');

            $types = array('products', 'categories', 'manufacturers', 'suppliers', 'scenes', 'stores');
            $total = count($types);

            foreach ($results as $result) {
                foreach ($result as $value) {
                    for ($i = 0; $i < $total; ++$i) {
                        self::$images_types_name_cache[$result['name'].'_'.$types[$i].'_'.$value] = $result;
                    }
                }
            }

            $is_passed = true;
        }

        $return = false;
        if (isset(self::$images_types_name_cache[$name.'_'.$type.'_'.$order])) {
            $return = self::$images_types_name_cache[$name.'_'.$type.'_'.$order];
        }
        return $return;
    }

    public static function getFormatedName($name)
    {
        $theme_name = Context::getContext()->shop->theme_name;
        $name_without_theme_name = str_replace(array('_'.$theme_name, $theme_name.'_'), '', $name);

        //check if the theme name is already in $name if yes only return $name
        if (strstr($name, $theme_name) && self::getByNameNType($name)) {
            return $name;
        } elseif (self::getByNameNType($name_without_theme_name.'_'.$theme_name)) {
            return $name_without_theme_name.'_'.$theme_name;
        } elseif (self::getByNameNType($theme_name.'_'.$name_without_theme_name)) {
            return $theme_name.'_'.$name_without_theme_name;
        } else {
            return $name_without_theme_name.'_default';
        }
    }
}
