<?php
/**
 * @author    Alexandre DEBUSSCHÈRE <alexandre@kosmonaft.dev>
 * @copyright 2021 Kosmonaft.dev
 * @license   Commercial
 */

if (!defined('_PS_VERSION_')) {
    exit;
}

/**
 * Class MRMaxUpgrade
 */
class MRMaxUpgrade
{

    protected static $migrations = [
        'upgrade114',
        'upgrade115',
        'upgrade128',
        'upgrade130',
        'upgrade140',
    ];

    /**
     * Runs every upgrade
     *
     * @param MRMax|null $module
     * @return void
     */
    public static function migrate(MRMax $module = null)
    {
        if (!$module) {
            $module = new MRMax();
        }

        foreach (static::$migrations as $migration) {
            call_user_func([static::class, $migration], $module);
        }
    }

    /**
     * Upgrade for version 1.1.4
     *
     * @param MRMax $module
     * @return bool
     */
    public static function upgrade114(MRMax $module)
    {
        $metadata = MRMaxTools::getTableColumnMetadata('mrmax_cache', 'name');
        if (isset($metadata['CHARACTER_MAXIMUM_LENGTH']) && $metadata['CHARACTER_MAXIMUM_LENGTH'] == 64) {
            return true;
        }

        return Db::getInstance()->execute('
            ALTER TABLE `'._DB_PREFIX_.'mrmax_cache`
            MODIFY `name` varchar(64)
        ');
    }

    /**
     * Upgrade for version 1.1.5
     *
     * @param MRMax $module
     * @return bool
     * @throws PrestaShopDatabaseException
     */
    public static function upgrade115(MRMax $module)
    {
        if (MRMaxTools::tableHasColumn('mrmax_delivery', 'id_customer')) {
            return true;
        }

        $success = Db::getInstance()->execute('
            ALTER TABLE `'._DB_PREFIX_.'mrmax_delivery`
            ADD `id_customer` int(11) DEFAULT 0
            AFTER `id_cart`
        ');

        // Below is okay if it fails
        Db::getInstance()->execute('
            UPDATE IGNORE `'._DB_PREFIX_.'mrmax_delivery` mmd
            SET mmd.`id_customer` = (
                SELECT c.`id_customer`
                FROM `'._DB_PREFIX_.'cart` c
                WHERE c.`id_cart` = mmd.`id_cart`
            )
        ');

        return $success;
    }

    /**
     * Upgrade for version 1.2.8
     *
     * @param MRMax $module
     * @return void
     */
    public static function upgrade128(MRMax $module)
    {
        if (!Configuration::hasKey('MRMAX_UNSELECTED_CARRIERS')) {
            Configuration::updateValue('MRMAX_UNSELECTED_CARRIERS', false);
        }
    }

    /**
     * Upgrade for version 1.3.0
     *
     * @param MRMax $module
     * @return void
     */
    public static function upgrade130(MRMax $module)
    {
        if (!MRMaxTools::tableHasColumn('mrmax_delivery', 'weight')) {
            Db::getInstance()->execute(
                'ALTER TABLE `'._DB_PREFIX_.'mrmax_delivery`
                ADD `weight` FLOAT(5) DEFAULT NULL
                AFTER `prid`'
            );
        }
    }

    /**
     * Upgrade for version 1.4.0
     *
     * @param MRMax $module
     * @return void
     */
    public static function upgrade140(MRMax $module)
    {
        if (!MRMaxTools::tableHasColumn('mrmax_delivery', 'nb_labels')) {
            Db::getInstance()->execute(
                'ALTER TABLE `'._DB_PREFIX_.'mrmax_delivery`
                ADD `nb_labels` INT(2) DEFAULT 1
                AFTER `weight`'
            );
        }
    }
}
