<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Magento\Directory\Setup;

use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;

/**
 * @codeCoverageIgnore
 */
class InstallSchema implements InstallSchemaInterface
{
    /**
     * {@inheritdoc}
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
     */
    public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
    {
        $installer = $setup;

        $installer->startSetup();

        /**
         * Create table 'directory_country'
         */
        $table = $installer->getConnection()->newTable(
            $installer->getTable('directory_country')
        )->addColumn(
            'country_id',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            2,
            ['nullable' => false, 'primary' => true, 'default' => false],
            'Country Id in ISO-2'
        )->addColumn(
            'iso2_code',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            2,
            ['nullable' => true, 'default' => null],
            'Country ISO-2 format'
        )->addColumn(
            'iso3_code',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            3,
            ['nullable' => true, 'default' => null],
            'Country ISO-3'
        )->setComment(
            'Directory Country'
        );
        $installer->getConnection()->createTable($table);

        /**
         * Create table 'directory_country_format'
         */
        $table = $installer->getConnection()->newTable(
            $installer->getTable('directory_country_format')
        )->addColumn(
            'country_format_id',
            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
            null,
            ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
            'Country Format Id'
        )->addColumn(
            'country_id',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            2,
            ['nullable' => true, 'default' => null],
            'Country Id in ISO-2'
        )->addColumn(
            'type',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            30,
            ['nullable' => true, 'default' => null],
            'Country Format Type'
        )->addColumn(
            'format',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            '64k',
            ['nullable' => false],
            'Country Format'
        )->addIndex(
            $installer->getIdxName(
                'directory_country_format',
                ['country_id', 'type'],
                \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE
            ),
            ['country_id', 'type'],
            ['type' => \Magento\Framework\DB\Adapter\AdapterInterface::INDEX_TYPE_UNIQUE]
        )->setComment(
            'Directory Country Format'
        );
        $installer->getConnection()->createTable($table);

        /**
         * Create table 'directory_country_region'
         */
        $table = $installer->getConnection()->newTable(
            $installer->getTable('directory_country_region')
        )->addColumn(
            'region_id',
            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
            null,
            ['identity' => true, 'unsigned' => true, 'nullable' => false, 'primary' => true],
            'Region Id'
        )->addColumn(
            'country_id',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            4,
            ['nullable' => false, 'default' => '0'],
            'Country Id in ISO-2'
        )->addColumn(
            'code',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            32,
            ['nullable' => true, 'default' => null],
            'Region code'
        )->addColumn(
            'default_name',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            255,
            [],
            'Region Name'
        )->addIndex(
            $installer->getIdxName('directory_country_region', ['country_id']),
            ['country_id']
        )->setComment(
            'Directory Country Region'
        );
        $installer->getConnection()->createTable($table);

        /**
         * Create table 'directory_country_region_name'
         */
        $table = $installer->getConnection()->newTable(
            $installer->getTable('directory_country_region_name')
        )->addColumn(
            'locale',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            8,
            ['nullable' => false, 'primary' => true, 'default' => false],
            'Locale'
        )->addColumn(
            'region_id',
            \Magento\Framework\DB\Ddl\Table::TYPE_INTEGER,
            null,
            ['unsigned' => true, 'nullable' => false, 'primary' => true, 'default' => '0'],
            'Region Id'
        )->addColumn(
            'name',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            255,
            ['nullable' => true, 'default' => null],
            'Region Name'
        )->addIndex(
            $installer->getIdxName('directory_country_region_name', ['region_id']),
            ['region_id']
        )->addForeignKey(
            $installer->getFkName(
                'directory_country_region_name',
                'region_id',
                'directory_country_region',
                'region_id'
            ),
            'region_id',
            $installer->getTable('directory_country_region'),
            'region_id',
            \Magento\Framework\DB\Ddl\Table::ACTION_CASCADE
        )->setComment(
            'Directory Country Region Name'
        );
        $installer->getConnection()->createTable($table);

        /**
         * Create table 'directory_currency_rate'
         */
        $table = $installer->getConnection()->newTable(
            $installer->getTable('directory_currency_rate')
        )->addColumn(
            'currency_from',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            3,
            ['nullable' => false, 'primary' => true, 'default' => false],
            'Currency Code Convert From'
        )->addColumn(
            'currency_to',
            \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
            3,
            ['nullable' => false, 'primary' => true, 'default' => false],
            'Currency Code Convert To'
        )->addColumn(
            'rate',
            \Magento\Framework\DB\Ddl\Table::TYPE_DECIMAL,
            '24,12',
            ['nullable' => false, 'default' => '0.000000000000'],
            'Currency Conversion Rate'
        )->addIndex(
            $installer->getIdxName('directory_currency_rate', ['currency_to']),
            ['currency_to']
        )->setComment(
            'Directory Currency Rate'
        );
        $installer->getConnection()->createTable($table);

        $installer->endSetup();

    }
}