<?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
/**
 * GurmeCargo GCARGO_DB_Handler sınıfını barındırır. Tablolara erişmek için kullanır.
 *
 * @package GurmeHub
 */

/**
 * GurmeCargo GCARGO_DB_Handler abstract sınıfı
 */
abstract class GCARGO_DB_Handler {

	/**
	 * Çalışılacak tablo adı prefix dahil adı
	 *
	 * @var string
	 */
	private $table_name;

	/**
	 * Çalışılacak tablo adı // prefix hariç
	 *
	 * @var string
	 */
	protected $name;


	/**
	 * Oluşturulma tarihi
	 *
	 * @var string
	 */
	protected $created_date;

	/**
	 * Oluşturulma tarihi
	 *
	 * @var string
	 */
	protected $updated_date;

	/**
	 * ID si
	 *
	 * @var int
	 */
	public $id;

	/**
	 * Benzersiz verinin kolonu
	 *
	 * @var int
	 */
	public $foreign_key;

	/**
	 * Eklenebilir, güncelleme yapılabilir ve değiştirilebilir olacak alanların listesi
	 *
	 * @var array
	 */
	public $fillable;

	/**
	 * Kurucu fonksiyon
	 *
	 * @param boolean|int $id Satır ID'si.
	 *
	 * @SuppressWarnings(PHPMD.BooleanArgumentFlag)
	 */
	public function __construct( $id = false ) {
		global $wpdb;
		$this->table_name = "{$wpdb->prefix}{$this->name}";
		if ( is_numeric( $id ) ) {
			$this->load_data( $this->get_row( $id ) );
		}
	}

	/**
	 * ID ile verilen satırı sınıfa yükler.
	 *
	 * @param int $id Satır ID'si.
	 *
	 * @return array veriyi döner
	 */
	public function get_row( $id ) {
		global $wpdb;
		$this->id = $id;
		return $wpdb->get_row( // phpcs:ignore WordPress.DB.DirectDatabaseQuery
			$wpdb->prepare( 'SELECT * FROM %i WHERE %i = %d', $this->table_name, $this->foreign_key, $id ),
			ARRAY_A
		);
	}

	/**
	 * Veriyi sınıfa yükler.
	 *
	 * @param array $data Veri dizisi.
	 */
	public function load_data( $data ) {
		foreach ( $this->filter_data( $data ) as $key => $value ) {
			$this->$key = apply_filters( "{$this->name}_{$key}", $value );
		}
		return $this;
	}

	/**
	 * Fillable veriyi filtreler.
	 *
	 * @param array $data Veri dizisi.
	 */
	protected function filter_data( $data ) {
		return array_filter( $data, fn( $key )=> in_array( $key, $this->fillable, true ), ARRAY_FILTER_USE_KEY );
	}

	/**
	 * DB ye yoksa kayıt eder. Varsa günceller.
	 */
	public function save() {
		global $wpdb;
		$row = $this->filter_data( get_object_vars( $this ) );
		if ( $this->id ) {
			$wpdb->update( //phpcs:ignore WordPress.DB.DirectDatabaseQuery
				$this->table_name,
				$row,
				array( $this->foreign_key => $this->id ),
			);
		} else {
			$wpdb->insert( //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery
				$this->table_name,
				$row
			);
			$this->id = $wpdb->get_var( //phpcs:ignore WordPress.DB.DirectDatabaseQuery
				$wpdb->prepare( 'SELECT %i FROM %i WHERE id = %d', $this->foreign_key, $this->table_name, $wpdb->insert_id )
			);
		}
		return $this;
	}

	/**
	 * DB den satırı siler.
	 */
	public function delete() {
		global $wpdb;

		$wpdb->delete( //phpcs:ignore WordPress.DB.DirectDatabaseQuery
			$this->table_name,
			array( $this->foreign_key => $this->id ),
		);
	}
}
