<?php
/**
 * GurmeCargo  için ilk yüklemeleri yapan GCargo_Installer sınıfını barındırır.
 *
 * @package GurmeHub
 */

/**
 * GurmeCargo Yükleme sınıfı.
 */
class GCARGO_Installer {

	/**
	 * Aktif db versiyonu.
	 *
	 * @var string $current_db_version
	 */
	public $current_db_version;

	/**
	 * Kayıtlı db versiyonu.
	 *
	 * @var string $old_db_version
	 */
	public $old_db_version;


	/**
	 * Yüklenecek tabloların listesi.
	 *
	 * @var array $tables
	 */
	private $tables = array(
		'shipments',
		'returneds',
	);

	/**
	 * Kurucu fonksiyon
	 *
	 * @return void
	 */
	public function install() {
		require_once ABSPATH . 'wp-admin/includes/upgrade.php';

		$this->current_db_version = GCARGO_DB_VERSION;
		$this->old_db_version     = get_option( 'gcargo_db_version', '0.0.0' );

		$this->install_latest_shipments_table();
		$this->install_latest_returneds_table();
		if ( version_compare( $this->current_db_version, $this->old_db_version, '>' ) ) {
			$this->version_update_000_to_100();
			$this->version_update_100_to_101();
			update_option( 'gcargo_db_version', GCARGO_DB_VERSION );
		}
	}

	/**
	 * Veri tabanında 0.0.0 versiyonundan 1.0.0 versiyonuna geçiş yapılırken uygulanan değişiklikler.
	 *
	 * Güncellemeler
	 *
	 * 1- Gönderiler tablosunu olusturur ve var olan verileri tasir.
	 */
	private function version_update_000_to_100() {
		$this->migrate_shipments_data();
	}

	/**
	 * Veri tabanında 1.0.0 versiyonundan 1.0.1 versiyonuna geçiş yapılırken uygulanan değişiklikler.
	 *
	 * Güncellemeler
	 *
	 * 1- Gönderiler tablosunun sorun çıkartan kolonları güncellendi.
	 */
	private function version_update_100_to_101() {
		global $wpdb;
		$table_name = "{$wpdb->prefix}gcargo_shipments";
		// phpcs:disable
		$wpdb->query(
			$wpdb->prepare(
				'ALTER TABLE %i
				DROP COLUMN created_date,
				DROP COLUMN updated_date;',
				$table_name
			)
		);
		$wpdb->query(
			$wpdb->prepare(
				'ALTER TABLE %i
				ADD created_date DATETIME DEFAULT CURRENT_TIMESTAMP,
				ADD updated_date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;',
				$table_name
			)
		);
		// phpcs:enable
	}

	/**
	 * Veri tabanında 0.0.0 versiyonundan 1.0.0 versiyonuna geçiş yapılırken uygulanan değişiklikler.
	 *
	 * Güncellemeler
	 *
	 * 1- Gönderiler tablosunu olusturur ve var olan verileri tasir.
	 */
	public function migrate_shipments_data() {
		global $wpdb;

		$hpos_data = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}wc_orders_meta where meta_key = 'gcargo_shipments'", ARRAY_A ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery
		$meta_data = $wpdb->get_results( "SELECT * FROM {$wpdb->postmeta} where meta_key = 'gcargo_shipments'", ARRAY_A ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery

		$full_data = array_merge( $meta_data, $hpos_data );

		foreach ( $full_data as $index => $row ) {
			$shipments = unserialize( $row['meta_value'] ); // phpcs:ignore
			foreach ( $shipments as $shipment ) {
				wp_schedule_single_event( time() + $index * 10, 'gcargo_migrate_shipment', array( $shipment ) );
			}
		}
	}
	/**
	 * Gönderiler tablosunu yükleme
	 *
	 * @return bool
	 */
	private function install_latest_shipments_table() {
		global $wpdb;
		$charset_collate = $wpdb->get_charset_collate();
		$table_name      = "{$wpdb->prefix}gcargo_shipments";
		$main_sql_create = "CREATE TABLE {$table_name}(
			id BIGINT AUTO_INCREMENT PRIMARY KEY,
			platform_id VARCHAR( 255 ) default '',
			shipment_id VARCHAR( 255 ) default '',
			status VARCHAR( 255 ) default 'draft',
			city LONGTEXT default '',
			payment_type VARCHAR( 255 ) default '',
			package_type VARCHAR( 255 ) default '',
			payor_type VARCHAR( 255 ) default '',
			desi float default 0.0,
			shipping_cost float default 0.0,
			is_pay_at_door TINYINT( 1 ) default 0,
			cargo_company LONGTEXT default '',
			full_json LONGTEXT default '',
			created_at VARCHAR( 255 ) default '',
			updated_at VARCHAR( 255 ) default '',
    		created_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    		updated_date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
		) $charset_collate;";

		return maybe_create_table( $table_name, $main_sql_create );
	}
	/**
	 * İadeler tablosunu yükleme
	 */
	private function install_latest_returneds_table() {
		global $wpdb;
		$charset_collate = $wpdb->get_charset_collate();
		$table_name      = "{$wpdb->prefix}gcargo_returneds";
		$main_sql_create = "CREATE TABLE {$table_name}(
			id BIGINT AUTO_INCREMENT PRIMARY KEY,
			platform_id VARCHAR( 255 ) default '',
			returned_id VARCHAR( 255 ) default '',
			status VARCHAR( 255 ) default 'draft',
			city LONGTEXT default '',
			payment_type VARCHAR( 255 ) default '',
			package_type VARCHAR( 255 ) default '',
			payor_type VARCHAR( 255 ) default '',
			note LONGTEXT default '',
			desi float default 0.0,
			shipping_cost float default 0.0,
			cargo_company LONGTEXT default '',
			full_json LONGTEXT default '',
			created_at VARCHAR( 255 ) default '',
			updated_at VARCHAR( 255 ) default '',
			return_at VARCHAR( 255 ) default '',
    		created_date DATETIME DEFAULT CURRENT_TIMESTAMP,
    		updated_date DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
		) $charset_collate;";

		return maybe_create_table( $table_name, $main_sql_create );
	}


	/**
	 * GurmePOS'un oluşturulduğu veritabanı tablolarını kaldırır.
	 */
	private function uninstall_db() {
		global $wpdb;
		foreach ( $this->tables as $table ) {
			$wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery
				$wpdb->prepare( 'DROP TABLE IF EXISTS %i', "{$wpdb->prefix}gcargo_{$table}" ) //phpcs:ignoreF
			);
		}

		$meta_keys = array(
			'_gcargo_shipped_qty',
			'_gcargo_returned_qty',
		);

		foreach ( $meta_keys as $meta_key ) {
			$wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery
				$wpdb->prepare(
					'DELETE FROM %i WHERE meta_key = %s',
					"{$wpdb->prefix}woocommerce_order_itemmeta",
					$meta_key
				)
			);
		}
	}

	/**
	 * GurmeCARGO'un oluşturulduğu veritabanı tekrar oluşturur.
	 */
	public function reinstall_db() {
		$this->uninstall_db();
		$this->install();
	}
}
