<?php
if ( ! defined( 'ABSPATH' ) ) { exit; }

/**
 * KNSDD_Database Class
 *
 * Eklentinin veritabanı işlemlerini yönetir.
 */
class KNSDD_Database {

    /**
     * Eklenti aktivasyonunda çalışır. Gerekli veritabanı tablosunu ve seçenekleri oluşturur.
     */
    public static function activate() {
        if ( false === get_option( 'knsdd_groups' ) ) { add_option( 'knsdd_groups', array() ); }
        if ( false === get_option( 'knsdd_group_dates' ) ) { add_option( 'knsdd_group_dates', array() ); }
        if ( false === get_option( 'knsdd_usage_tracker' ) ) { add_option( 'knsdd_usage_tracker', array() ); }
        if ( false === get_option( 'knsdd_global_settings' ) ) {
            add_option( 'knsdd_global_settings', [
                'global_status'   => 1,
                'language_mode'   => 'auto',
                'language_locale' => 'en_US',
            ] );
        }

        // İstatistik log tablosu
        global $wpdb;
        $table_name = $wpdb->prefix . 'knsdd_usage_log';
        $charset_collate = $wpdb->get_charset_collate();
        $sql = "CREATE TABLE IF NOT EXISTS {$table_name} (
            id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
            order_id BIGINT UNSIGNED NOT NULL,
            customer_id BIGINT UNSIGNED NOT NULL DEFAULT 0,
            customer_email VARCHAR(190) NOT NULL DEFAULT '',
            rule_id VARCHAR(64) NOT NULL,
            group_name VARCHAR(190) DEFAULT '' NOT NULL,
            discount_amount DECIMAL(10,2) NOT NULL DEFAULT 0,
            order_total DECIMAL(10,2) NOT NULL DEFAULT 0,
            currency VARCHAR(8) DEFAULT '' NOT NULL,
            created_at DATETIME NOT NULL,
            meta LONGTEXT NULL,
            PRIMARY KEY  (id),
            KEY created_at (created_at),
            KEY rule_id (rule_id),
            KEY group_name (group_name),
            KEY customer_id (customer_id),
            KEY order_id (order_id),
            KEY customer_email (customer_email),
            KEY group_created (group_name, created_at),
            KEY customer_created (customer_id, created_at),
            KEY rule_created (rule_id, created_at)
        ) $charset_collate;";

        require_once ABSPATH . 'wp-admin/includes/upgrade.php';
        dbDelta( $sql );
        
        // Mevcut kurulumlar için order_total sütununu ekle
        self::maybe_add_order_total_column();
        
        // Mevcut gruplara rule_type ekle
        self::maybe_add_rule_type_column();
        
        update_option( 'knsdd_db_version', KNSDD_VERSION );
    }

    /**
     * Mevcut tabloya order_total sütunu ekle (migration)
     */
    public static function maybe_add_order_total_column() {
        global $wpdb;
        $table = $wpdb->prefix . 'knsdd_usage_log';
        
        // Önce tablo var mı kontrol et
        $table_exists = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table ) );
        if ( $table_exists !== $table ) {
            return; // Tablo yoksa işlem yapma (activate() oluşturacak)
        }
        
        // Sütun zaten var mı kontrol et
        $column_exists = $wpdb->get_results( $wpdb->prepare(
            "SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s AND COLUMN_NAME = 'order_total'",
            DB_NAME,
            $table
        ) );
        
        if ( empty( $column_exists ) ) {
            $wpdb->query( "ALTER TABLE {$table} ADD COLUMN order_total DECIMAL(10,2) NOT NULL DEFAULT 0 AFTER discount_amount" );
        }
    }

    /**
     * Grup tablosuna rule_type sütunu ekle ve mevcut grupları analiz et (migration)
     * 
     * Grup tipleri:
     * - fixed_discount: Sabit indirim (kademeli miktar indirimi)
     * - special_campaign: Özel kampanya (BOGO, Sepet İndirimi vb.)
     */
    public static function maybe_add_rule_type_column() {
        // knsdd_groups basit array (grup isimleri listesi)
        // rule_type'ları ayrı option'da saklayacağız: knsdd_group_rule_types
        $groups = get_option( 'knsdd_groups', array() );
        
        if ( empty( $groups ) ) {
            return; // Grup yoksa işlem yapma
        }
        
        // Mevcut rule_types'ı al
        $rule_types = get_option( 'knsdd_group_rule_types', [] );
        $updated = false;
        
        foreach ( $groups as $group_name ) {
            // Güvenlik kontrolü: $group_name string olmalı
            if ( ! is_string( $group_name ) || empty( $group_name ) ) {
                continue;
            }
            
            // Eğer rule_type zaten varsa atla
            if ( isset( $rule_types[ $group_name ] ) ) {
                continue;
            }
            
            // Bu grupta özel kampanya var mı kontrol et
            $rules = get_option( 'knsdd_rules_' . sanitize_key( $group_name ), [] );
            $has_special = false;
            
            if ( is_array( $rules ) ) {
                foreach ( $rules as $rule ) {
                    if ( ! empty( $rule['campaign_type'] ) ) {
                        $has_special = true;
                        break;
                    }
                }
            }
            
            // Tip ata
            $rule_types[ $group_name ] = $has_special ? 'special_campaign' : 'fixed_discount';
            $updated = true;
        }
        
        if ( $updated ) {
            update_option( 'knsdd_group_rule_types', $rule_types );
        }
    }

    /**
     * Kullanım log tablosunun var olup olmadığını kontrol eder, yoksa oluşturur.
     */
    public static function maybe_create_usage_log_table() {
        global $wpdb;
        $table_name = $wpdb->prefix . 'knsdd_usage_log';
        $exists = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $table_name ) );
        if ( $exists !== $table_name ) {
            self::activate();
        }
    }

    /**
     * Belirli bir grup adını usage_log tablosunda topluca yeniden adlandırır.
     * Örn: EskiGrup -> YeniGrup (tüm geçmiş kullanım verileri yeni ada taşınır)
     *
     * @param string $old_name
     * @param string $new_name
     * @return int Etkilenen satır sayısı
     */
    public static function rename_group( $old_name, $new_name ) {
        if ( ! is_string( $old_name ) || ! is_string( $new_name ) ) { return 0; }
        $old_name = trim( $old_name );
        $new_name = trim( $new_name );
        if ( $old_name === '' || $new_name === '' || $old_name === $new_name ) { return 0; }

        global $wpdb;
        $table = $wpdb->prefix . 'knsdd_usage_log';
        // prepare ile güvenli şekilde güncelle
        $sql = $wpdb->prepare( "UPDATE {$table} SET group_name = %s WHERE group_name = %s", $new_name, $old_name );
        $result = $wpdb->query( $sql );
        return (int) $result;
    }

    /**
     * Belirli bir siparişe (order_id) ait usage_log kayıtlarını topluca siler.
     * Performans: order_id üzerinde indeks mevcut.
     *
     * @param int $order_id
     * @return int Etkilenen satır sayısı
     */
    public static function delete_logs_by_order_id( $order_id ) {
        $order_id = (int) $order_id;
        if ( $order_id <= 0 ) { return 0; }
        global $wpdb;
        $table = $wpdb->prefix . 'knsdd_usage_log';
        $sql = $wpdb->prepare( "DELETE FROM {$table} WHERE order_id = %d", $order_id );
        $result = $wpdb->query( $sql );
        return (int) $result;
    }

    /**
     * Belirli bir grup adına ait tüm usage_log kayıtlarını siler.
     * Varsayılan davranış: GRUP SİLİNİNCE LOG'LAR DA SİLİNİR.
     *
     * @param string $group_name
     * @return int Etkilenen satır sayısı
     */
    public static function delete_logs_by_group( $group_name ) {
        if ( ! is_string( $group_name ) ) { return 0; }
        $group_name = trim( $group_name );
        if ( $group_name === '' ) { return 0; }
        global $wpdb;
        $table = $wpdb->prefix . 'knsdd_usage_log';
        $sql = $wpdb->prepare( "DELETE FROM {$table} WHERE group_name = %s", $group_name );
        $result = $wpdb->query( $sql );
        return (int) $result;
    }
}
