<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

/*
| ab_account_billing            |
| ab_account_group              |
| ab_account_log                |
| ab_account_memo               |
| ab_account_oauth              |
| product_broadband             |*DONE*
| supplier_broadband            |*DONE*
| ab_affiliate                  |
| ab_asset                      |
| ab_asset_pool                 |
| ab_cart                       |
| ab_checkout                   |
| ab_checkout_notify            |
| ab_discount                   |
| ab_domain_registrar           |
| ab_domain_tld                 |
| ab_email_log                  |
| ab_email_setup                |
| ab_email_template             |
| ab_email_template_translate   |
| ab_export                     |
| ab_export_datamap             |
| ab_export_item                |
| ab_export_module              |
| ab_group                      |
| ab_group_method               |
| ab_host_server                |
| ab_host_server_affiliate      |
| ab_host_server_id             |
| ab_host_tld_id                |
| ab_import                     |
| ab_invoice                    |
| ab_invoice_item               |
| ab_invoice_item_discount      |
| ab_invoice_item_tax           |
| ab_invoice_memo               |
| ab_log_error                  |
| ab_module                     |
| ab_module_method              |
| ab_module_method_token        |
| ab_oauth                      |
| ab_pivot_product_cat          |
| products                      |*PARTIAL* - make model/model_id NOT NULL
| ab_product_cat                |
| ab_product_cat_translate      |
| ab_product_translate          |
| ab_record_id                  |
| rtm                           |*DONE*
| ab_service                    |
| ab_service__adsl              |
| ab_service__adsl_traffic      |
| ab_service__hosting           |
| ab_service__ssl               |
| ab_service__voip              |
| ab_service_change             |
| ab_service_memo               |
| ab_setup_invoice              |
| ab_ssl                        |
| ab_ssl_ca                     |
| ab_static_page                |
| ab_static_page_category       |
| ab_static_page_translate      |
| ab_task                       |
| ab_task_log                   |
| ab_voip_plan                  |
| accounts                      |*PARTIAL* - make timestamp columns, make date_expire timestamp
| charges                       |
| countries                     |*DONE*
| currencies                    |*DONE*
| external_account              |
| external_integrations         |
| failed_jobs                   |*N/A*
| invites                       |
| jobs                          |*N/A*
| languages                     |*DONE*
| migrations                    |*N/A*
| oauth_access_tokens           |
| oauth_auth_codes              |
| oauth_clients                 |
| oauth_personal_access_clients |
| oauth_refresh_tokens          |
| password_resets               |
| payment_items                 |
| payments                      |
| quickbooks_tokens             |
| service__generic              |
| service_domains               |
| site_details                  |*DONE*
| sites                         |*DONE*
| supplier_details              |*DONE*
| suppliers                     |*DONE*
| taxes                         |*DONE*
| users                         |*DONE*
 */
class IntUnsigned extends Migration
{
	public function up()
	{
		$constraints = [
			'ab_account_billing' => ['fk_ab_a','fk_ab_s'],
			'ab_account_group' => ['fk_ag_acc','fk_ag_grp'],
			'ab_account_log' => ['fk_al_acc'],
			'ab_account_oauth' => ['fk_ao_a','fk_ao_o','site_user_id'],
			'ab_adsl_plan' => ['fk_ap_asp'],
			'ab_adsl_supplier' => ['fk_as_set'],
			'ab_adsl_supplier_plan' => ['fk_asp_as'],
			'ab_affiliate' => ['fk_aff_acc'],
			'ab_cart' => ['fk_mod_crt'],
			'ab_checkout' => ['fk_cko_set'],
			'ab_checkout_notify' => ['fk_cn_c'],
			'ab_domain_tld' => ['fk_ht_hrp'],
			'ab_email_log' => ['fk_el_acc','fk_el_ett','fk_el_mod'],
			'ab_email_setup' => ['fk_es_acc'],
			'ab_email_template' => ['fk_et_es'],
			'ab_email_template_translate' => ['fk_emt_et','fk_emt_lan'],
			'ab_export' => ['fk_exp_set'],
			'ab_export_datamap' => ['fk_edm_exm','fk_edm_mod'],
			'ab_export_item' => ['fk_eit_exm'],
			'ab_export_module' => ['fk_exm_exp','fk_exm_mod'],
			'ab_group' => ['fk_grp_set'],
			'ab_group_method' => ['fk_gm_grp','fk_gm_mm'],
			'ab_host_server_affiliate' => ['fk_hsa_aff','fk_hsa_hs'],
			'ab_invoice' => ['fk_inv_acc'],
			'ab_invoice_item' => ['fk_ii_inv','fk_ii_mod','fk_ii_pdt','fk_ii_svc'],
			'ab_invoice_item_tax' => ['fk_iit_ii','fk_iit_tax'],
			'ab_invoice_memo' => ['fk_im_acc','fk_im_inv'],
			'ab_module' => ['fk_mod','fk_mod_set'],
			'ab_module_method' => ['fk_mm_mod'],
			'ab_module_method_token' => ['fk_mmt_acc','fk_mmt_mm'],
			'ab_oauth' => ['fk_o_set'],
			'ab_pivot_product_cat' => ['fk_p','fk_pc'],
			'ab_product' => ['fk_pdt_set'],
			'ab_product_cat_translate' => ['fk_pct_lan','fk_pct_pc'],
			'ab_product_cat' => ['fk_pc_pc','fk_pc_set'],
			'ab_product_translate' => ['fk_pt_l','fk_pt_p'],
			'ab_record_id' => ['fk_rid_mod','fk_rid_set'],
			'rtm' => ['fk_rtm_acc','fk_rtm_rtm'],
			'ab_service__adsl_traffic' => ['ab_service__adsl_traffic_ab_service_adsl_id_foreign','fk_sat_as'],
			'ab_service__adsl' => ['fk_sa_ap','fk_sa_svc'],
			'ab_service__hosting' => ['fk_sh_svc','fk_sh_ht','fk_sh_hs'],
			'ab_service__ssl' => ['fk_ss_sca','fk_ss_svc'],
			'ab_service_change' => ['fk_sc_a','fk_sc_p','fk_sc_s'],
			'ab_service_memo' => ['fk_sm_acc','fk_sm_svc'],
			'ab_service' => ['ab_service_orderby_id_foreign','fk_svc_acc','fk_svc_grp'],
			'ab_ssl' => ['fk_ssl_set'],
			'ab_ssl_ca' => ['fk_sca','fk_sca_acc'],
			'ab_task_log' => ['fk_tl_t'],
			'ab_task' => ['fk_tsk_set'],
			'accounts' => ['ab_account_user_id_foreign','fk_acc_cty','fk_acc_cur','fk_acc_lan','fk_acc_rtm','fk_acc_set'],
			'charges' => ['charges_account_id_site_id_foreign','charges_product_id_site_id_foreign','charges_service_id_site_id_foreign','charges_user_id_site_id_foreign'],
			'countries' => ['countries_currency_id_foreign'],
			'external_account' => ['external_account_account_id_foreign','external_account_external_integration_id_foreign','external_account_site_id_foreign'],
			'external_integrations' => ['external_integrations_user_id_foreign'],
			'payment_items' => ['fk_pi_inv','payment_items_payment_id_site_id_foreign'],
			'payments' => ['fk_pay_acc','fk_pay_acc_b','fk_pay_co'],
			'quickbooks_tokens' => ['quickbooks_tokens_user_id_foreign'],
			'service__generic' => ['service__generic_product_id_site_id_foreign','service__generic_service_id_site_id_foreign','service__generic_site_id_foreign'],
			'service_domains' => ['fk_sd_hrp','fk_sd_ht','fk_sd_svc'],
			'site_details' => ['site_details_site_id_foreign'],
			'sites' => ['sites_admin_id_site_id_foreign','sites_country_id_foreign','sites_currency_id_foreign','sites_language_id_foreign'],
			'supplier_details' => ['supplier_details_site_id_foreign','supplier_details_supplier_id_foreign'],
			'taxes' => ['taxes_country_id_foreign'],
			'users' => ['users_currency_id_foreign','users_language_id_foreign','users_parent_id_foreign'],
		];
		$indexes = [
			'ab_account_billing' => ['fk_ab_a','fk_ab_s','UNIQUE'],
			'ab_account_group' => ['fk_ag_acc_idx','fk_ag_grp_idx','UNIQUE'],
			'ab_account_log' => ['fk_al_acc_idx'],
			'ab_account_memo' => ['memo','account','IDS'],
			'ab_account_oauth' => ['fk_ao_a_idx','fk_ao_o_idx','site_user_id_idx','ab_account_oauth_site_id_user_id_oauth_id_unique','UNIQUE'],
			'ab_adsl_supplier_plan' => ['fk_asp_as_idx'],
			'ab_adsl_supplier' => ['fk_as_set_idx'],
			'ab_adsl_plan' => ['fk_ap_asp_idx'],
			'ab_affiliate' => ['fk_aff_acc_idx'],
			'ab_asset_pool' => ['main','IDS'],
			'ab_asset' => ['assets','asso','service','asset','IDS'],
			'ab_cart' => ['fk_mod_crt_idx'],
			'ab_checkout_notify' => ['fk_cn_c_idx'],
			'ab_checkout' => ['fk_cko_set_idx'],
			'ab_discount' => ['start','expire','status','IDS'],
			'ab_domain_registrar' => ['fk_hrp_set','IDS'],
			'ab_domain_tld' => ['fk_ht_hrp_idx'],
			'ab_email_log' => ['fk_el_acc_idx','fk_el_ett_idx','fk_el_mod_idx'],
			'ab_email_setup' => ['fk_es_acc_idx'],
			'ab_email_template_translate' => ['fk_emt_et_idx','fk_emt_lan_idx'],
			'ab_email_template' => ['fk_et_es_idx'],
			'ab_export_datamap' => ['fk_edm_mod_idx','fk_edm_mod_idx1','UNIQUE'],
			'ab_export_item' => ['fk_exp_eit_idx','UNIQUE'],
			'ab_export_module' => ['fk_exp_exm_idx','fk_exp_mod_idx'],
			'ab_export' => ['fk_exp_set_idx','UNIQUE'],
			'ab_group_method' => ['fk_gm_grp_idx','fk_gm_mm_idx','UNIQUE'],
			'ab_group' => ['fk_grp_set_idx'],
			'ab_host_server' => ['IDS'],
			'ab_host_server_affiliate' => ['fk_hsa_aff_idx','fk_hsa_hs_idx'],
			'ab_import' => ['IDS'],
			'ab_invoice_item_discount' => ['discounts','invoice_id','dates','accounts','IDS'],
			'ab_invoice_item_tax' => ['fk_iit_ii_idx','fk_iit_tax_idx'],
			'ab_invoice_item' => ['fk_ii_inv_idx','fk_ii_mod_idx','fk_ii_pdt_idx','fk_ii_svc_idx','UNIQUE'],
			'ab_invoice_memo' => ['fk_im_acc_idx','fk_im_inv_idx'],
			'ab_invoice' => ['fk_inv_acc_idx'],
			'ab_log_error' => ['IDS'],
			'ab_module_method_token' => ['fk_mmt_acc_idx','fk_mmt_mm_idx'],
			'ab_module_method' => ['fk_mm_mod_idx','UNIQUE','UNIQUE2'],
			'ab_module' => ['fk_mod_idx','fk_mod_set_idx','UNIQUE'],
			'ab_oauth' => ['fk_o_set_idx','ab_oauth_site_id_name_unique'],
			'ab_pivot_product_cat' => ['fk_p_idx','fk_pc_idx','UNIQUE'],
			'ab_product_cat' => ['fk_pc_pc_idx','fk_pc_set_idx'],
			'ab_product' => ['fk_pdt_set_idx'],
			'ab_product_cat_translate' => ['fk_pct_lan_idx','fk_pct_pc_idx','UNIQUE'],
			'ab_product_translate' => ['fk_pt_l_idx','fk_pt_p_idx','UNIQUE'],
			'ab_record_id' => ['fk_rid_mod_idx','fk_rid_set_idx'],
			'rtm' => ['fk_rtm_set_idx','fk_rtm_acc_p_idx','uq_name'],
			'ab_service' => ['ab_service_orderby_id_foreign','fk_svc_acc_idx','fk_svc_grp_idx','UNIQUE'],
			'ab_service__adsl' => ['fk_service_number','fk_sa_svc_idx','fk_sa_ap_idx','uq_service_username','UNIQUE'],
			'ab_service__adsl_traffic' => ['fk_sat_as_idx','in_sat_SERVICE_DATE','in_sat_DATE','in_sat_SERVICE','ab_service__adsl_traffic_ab_service_adsl_id_date_time_unique'],
			'ab_service__hosting' => ['fk_sh_hs_idx','fk_domain_tld_id','fk_service_id','uq_ftp_username','UNIQUE'],
			'ab_service__ssl' => ['fk_ss_sca_idx','fk_ss_svc_idx','UNIQUE'],
			'ab_service_change' => ['fk_s_sc_idx','fk_s_p_idx','fk_sc_a_idx'],
			'ab_service_memo' => ['fk_sm_acc_idx','fk_sm_svc_idx'],
			'ab_setup_invoice' => ['IDS'],
			'ab_ssl' => ['fk_ssl_set_idx'],
			'ab_ssl_ca' => ['fk_sca_idx','fk_sca_acc_idx'],
			'ab_static_page' => ['cat','start','expire','name','IDS'],
			'ab_static_page_category' => ['status','name','IDS'],
			'ab_static_page_translate' => ['IDS'],
			'ab_task' => ['fk_tsk_set_idx'],
			'ab_task_log' => ['fk_tl_task'],
			'accounts' => ['ab_account_user_id_foreign','fk_acc_set_idx','fk_acc_lan_idx','fk_acc_rtm_idx','fk_acc_cty_idx','fk_acc_cur_idx'],
			'charges' => ['charges_account_id_site_id_foreign','charges_product_id_site_id_foreign','charges_service_id_site_id_foreign','charges_user_id_site_id_foreign'],
			'countries' => ['countries_currency_id_foreign','name_UNIQUE','two_code_UNIQUE','three_code_UNIQUE'],
			'currencies' => ['three_digit_UNIQUE'],
			'external_account' => ['external_account_external_integration_id_foreign','external_account_account_id_foreign','sae'],
			'external_integrations' => ['external_integrations_user_id_foreign'],
			'languages' => ['name_UNIQUE','iso_UNIQUE'],
			'payment_items' => ['fk_pi_inv_idx','payment_items_payment_id_site_id_foreign','payment_items_site_id_payment_id_invoice_id_unique'],
			'payments' => ['fk_pay_acc_idx','fk_pay_cp_idx','fk_pay_acc_b_idx','payments_site_id_id_unique'],
			'quickbooks_tokens' => ['quickbooks_tokens_user_id_foreign'],
			'service__generic' => ['service__generic_service_id_site_id_foreign','service__generic_product_id_site_id_foreign','service__generic_site_id_service_id_unique'],
			'service_domains' => ['fk_sd_svc_idx','fk_sd_hrp_idx','fk_sd_ht_idx','UNIQUE'],
			'site_details' => ['site_details_site_id_key_unique'],
			'sites' => ['sites_site_id_index','sites_admin_id_site_id_foreign','sites_country_id_foreign','sites_currency_id_foreign','sites_language_id_foreign','sites_site_id_url_unique'],
			'supplier_details' => ['supplier_details_site_id_foreign','supplier_details_supplier_id_site_id_unique'],
			'taxes' => ['UNIQUE'],
			'users' => ['users_site_id_email_unique','users_parent_id_foreign','users_language_id_foreign','users_currency_id_foreign','site_user_id_idx'],
		];

		Schema::dropIfExists('ab_host_server_id');
		Schema::dropIfExists('ab_host_tld_id');
		DB::statement('ALTER TABLE ab_rtm RENAME TO rtm');

		foreach ($constraints as $table => $constraint) {
			Schema::table($table, function (Blueprint $table) use ($constraint) {
				foreach ($constraint as $item)
					$table->dropForeign($item);
			});
		}

		foreach ($indexes as $table => $constraint) {
			Schema::table($table, function (Blueprint $table) use ($constraint) {
				foreach ($constraint as $item)
					$table->dropIndex($item);
			});
		}

		$tables = collect(array_unique(array_merge(array_keys($constraints),array_keys($indexes))));
		$except = [
			'ab_group','ab_record_id','ab_service__adsl_traffic','accounts','external_account','site_details',
			'ab_account_memo','ab_asset_pool','ab_asset','ab_discount','ab_host_server','ab_import','ab_invoice_item_discount',
			'ab_log_error','ab_setup_invoice','ab_static_page','ab_static_page_category','ab_static_page_translate',
			'ab_email_template',
		];

		foreach ($tables->diff($except) as $table) {
			DB::statement(sprintf('ALTER TABLE %s MODIFY id int unsigned auto_increment',$table));

			if (Schema::hasColumn($table,'site_id')) {
				DB::statement(sprintf('ALTER TABLE %s MODIFY site_id int unsigned NOT NULL',$table));
			}
		}

		Schema::table('sites', function (Blueprint $table) {
			$table->index(['site_id']);
		});

		foreach ($tables->diff($except)->diff(['sites']) as $table) {
			if (Schema::hasColumn($table,'site_id')) {
				dump($table);
				Schema::table($table, function (Blueprint $table) {
					$table->foreign(['site_id'])->references(['site_id'])->on('sites');
					$table->index(['id','site_id']);
				});
			}
		}

		DB::statement('ALTER TABLE currencies RENAME COLUMN iso_code TO iso');
		Schema::table('currencies', function (Blueprint $table) {
			$table->unique(['name']);
			$table->unique(['iso']);
		});

		Schema::table('languages', function (Blueprint $table) {
			$table->unique(['name']);
			$table->unique(['iso']);
		});

		DB::statement('ALTER TABLE countries MODIFY currency_id int unsigned');
		Schema::table('countries', function (Blueprint $table) {
			$table->foreign(['currency_id'])->references(['id'])->on('currencies');
			$table->index(['id','currency_id']);
			$table->unique(['name']);
			$table->unique(['two_code']);
			$table->unique(['three_code']);
		});

		DB::statement('ALTER TABLE users MODIFY country_id int unsigned NOT NULL,MODIFY language_id int unsigned NOT NULL,MODIFY currency_id int unsigned NOT NULL');
		Schema::table('users', function (Blueprint $table) {
			$table->dropColumn(['currency_id']);
			$table->foreign(['country_id'])->references(['id'])->on('countries');
			$table->foreign(['parent_id','site_id'])->references(['id','site_id'])->on('users');
			$table->foreign(['language_id'])->references(['id'])->on('languages');
		});

		DB::statement('DELETE FROM accounts WHERE id=0');
		DB::statement('ALTER TABLE accounts MODIFY id int unsigned auto_increment');
		DB::statement('ALTER TABLE accounts MODIFY site_id int unsigned NOT NULL');
		DB::statement('ALTER TABLE accounts MODIFY country_id int unsigned NOT NULL,MODIFY language_id int unsigned NOT NULL,MODIFY currency_id int unsigned NOT NULL,MODIFY rtm_id int unsigned DEFAULT NULL,MODIFY active tinyint(1) NOT NULL');
		Schema::table('accounts', function (Blueprint $table) {
			$table->dropColumn(['currency_id','language_id']);
			$table->foreign(['site_id'])->references(['site_id'])->on('sites');
			$table->index(['id','site_id']);
			$table->foreign(['country_id'])->references(['id'])->on('countries');
			$table->foreign(['user_id','site_id'])->references(['id','site_id'])->on('users');
			$table->foreign(['rtm_id','site_id'])->references(['id','site_id'])->on('rtm');
		});

		DB::statement('ALTER TABLE rtm MODIFY account_id int unsigned NOT NULL,MODIFY parent_id int unsigned');
		Schema::table('rtm', function (Blueprint $table) {
			$table->foreign(['parent_id','site_id'])->references(['id','site_id'])->on('rtm');
			$table->foreign(['account_id','site_id'])->references(['id','site_id'])->on('accounts');
		});

		DB::statement('ALTER TABLE sites MODIFY country_id int unsigned NOT NULL,MODIFY language_id int unsigned NOT NULL,MODIFY currency_id int unsigned NOT NULL');

		Schema::table('sites', function (Blueprint $table) {
			$table->foreign(['country_id','currency_id'])->references(['id','currency_id'])->on('countries');
			$table->foreign(['admin_id','site_id'])->references(['id','site_id'])->on('users');
			$table->foreign(['language_id'])->references(['id'])->on('languages');
		});

		DB::statement('ALTER TABLE site_details MODIFY site_id int unsigned NOT NULL');
		Schema::table('site_details', function (Blueprint $table) {
			$table->foreign(['site_id'])->references(['id'])->on('sites');
			$table->unique(['site_id','key']);
		});

		DB::statement('ALTER TABLE taxes MODIFY country_id int unsigned NOT NULL');
		Schema::table('taxes', function (Blueprint $table) {
			$table->foreign(['country_id'])->references(['id'])->on('countries');
			$table->unique(['country_id','zone']);
		});
	}
}