<?php
/**
 * Arag_Shop_AI — مشاور فروش هوشمند فروشگاه عرقیات
 * LLM (OpenAI-compatible) + fallback قانون‌محور از کاتالوگ
 */
if ( ! defined( 'ABSPATH' ) ) exit;

require_once ACC_PATH . 'includes/helpers/arag-shop.php';

class Arag_Shop_AI {

    public static function config(): array {
        return [
            'enabled'  => get_option( 'acc_shop_ai_enabled', '1' ) === '1',
            'api_key'  => (string) get_option( 'acc_shop_ai_api_key', '' ),
            'base_url' => rtrim( (string) get_option( 'acc_shop_ai_base_url', 'https://api.openai.com/v1' ), '/' ),
            'model'    => (string) get_option( 'acc_shop_ai_model', 'gpt-4o-mini' ),
        ];
    }

    public static function chat( string $message, array $history = [], string $session_id = '', string $mizaj_type = '' ): array {
        $message = trim( $message );
        if ( $message === '' ) {
            return [ 'success' => false, 'message' => 'پیام خالی است' ];
        }

        $catalog = self::catalog_summary();
        $cfg     = self::config();
        $mizaj_hint = '';
        if ( $mizaj_type && file_exists( ACC_PATH . 'includes/helpers/arag-mizaj.php' ) ) {
            require_once ACC_PATH . 'includes/helpers/arag-mizaj.php';
            $prof = Arag_Mizaj::profile( $mizaj_type );
            $mizaj_hint = "\nمزاج کاربر: {$mizaj_type} — " . ( $prof['summary'] ?? '' );
        }

        if ( $cfg['enabled'] && $cfg['api_key'] ) {
            $llm = self::llm_reply( $message, $history, $catalog, $cfg );
            if ( $llm['success'] ) {
                self::log_exchange( $session_id, $message, $llm['reply'], 'llm' );
                return $llm;
            }
        }

        $rule = self::rule_based_reply( $message, $catalog, $mizaj_type );
        self::log_exchange( $session_id, $message, $rule['reply'], 'rules' );
        return $rule;
    }

    public static function catalog_summary(): array {
        $families = Arag_Shop::list_families_public();
        $out = [];
        foreach ( $families as $f ) {
            $pdp = Arag_Shop::get_family_by_slug( $f['slug'] );
            if ( ! $pdp ) continue;
            $packages = [];
            foreach ( $pdp['variants'] ?? [] as $v ) {
                foreach ( $v['packages'] ?? [] as $p ) {
                    $packages[] = [
                        'label'  => $v['name'] . ' — ' . $p['label'],
                        'volume' => $p['volume'],
                        'price'  => (float) $p['price'],
                        'id'     => (int) $p['id'],
                    ];
                }
            }
            usort( $packages, static fn( $a, $b ) => $a['price'] <=> $b['price'] );
            $out[] = [
                'id'       => $f['id'],
                'name'     => $f['name'],
                'slug'     => $f['slug'],
                'tagline'  => $f['tagline'] ?? '',
                'summary'  => $pdp['description_short'] ?? '',
                'min_price'=> $f['min_price'] ?? ( $packages[0]['price'] ?? 0 ),
                'in_stock' => $f['in_stock'] ?? true,
                'stock_qty'=> $f['stock_qty'],
                'packages' => array_slice( $packages, 0, 6 ),
                'rating'   => $pdp['rating_avg'] ?? 0,
            ];
        }
        return $out;
    }

    public static function build_context_text( array $catalog ): string {
        $lines = [ 'کاتالوگ فروشگاه عرقیات سنتی ACC:' ];
        foreach ( $catalog as $p ) {
            $price = number_format( (float) $p['min_price'] );
            $stock = ( $p['in_stock'] ?? true ) ? 'موجود' : 'ناموجود';
            $lines[] = "- {$p['name']} (slug={$p['slug']}): {$p['tagline']} | از {$price} تومان | {$stock}";
            foreach ( array_slice( $p['packages'], 0, 3 ) as $pkg ) {
                $lines[] = "  · {$pkg['label']} {$pkg['volume']}: " . number_format( $pkg['price'] ) . ' تومان';
            }
        }
        $lines[] = 'ارسال: پست/تیپاکس (کرایه پس‌پرداخت). پرداخت: زرین‌پال، COD، کارت‌به‌کارت.';
        $lines[] = 'کوپن‌ها: ARAG10 (۱۰٪)، ARAG15 (۱۵٪ بالای ۵۰۰هزار)، WELCOME20 (۲۰٪ بالای ۱میلیون).';
        return implode( "\n", $lines );
    }

    public static function llm_reply( string $message, array $history, array $catalog, ?array $cfg = null ): array {
        $cfg = $cfg ?: self::config();
        $context = self::build_context_text( $catalog );

        $system = <<<SYS
شما مشاور فروش «فروشگاه عرقیات ACC» هستید. فقط فارسی، محترمانه و کوتاه پاسخ دهید.
از اطلاعات کاتالوگ زیر استفاده کنید؛ اگر جواب در کاتالوگ نیست صادقانه بگویید و پیشنهاد تماس با پشتیبانی بدهید.
هرگز قیمت یا موجودی جعلی نسازید. برای خرید کاربر را به صفحه محصول هدایت کنید: shop.php?p={slug}

{$context}
{$mizaj_hint}
SYS;

        $messages = [ [ 'role' => 'system', 'content' => $system ] ];
        foreach ( array_slice( $history, -8 ) as $h ) {
            $role = ( $h['role'] ?? '' ) === 'assistant' ? 'assistant' : 'user';
            $text = trim( (string) ( $h['content'] ?? $h['text'] ?? '' ) );
            if ( $text ) {
                $messages[] = [ 'role' => $role, 'content' => $text ];
            }
        }
        $messages[] = [ 'role' => 'user', 'content' => $message ];

        $url  = $cfg['base_url'] . '/chat/completions';
        $body = wp_json_encode( [
            'model'       => $cfg['model'],
            'messages'    => $messages,
            'temperature' => 0.4,
            'max_tokens'  => 600,
        ] );

        $res = self::_http_post( $url, $body, [
            'Authorization: Bearer ' . $cfg['api_key'],
            'Content-Type: application/json',
        ] );

        $reply = trim( (string) ( $res['choices'][0]['message']['content'] ?? '' ) );
        if ( $reply === '' ) {
            $err = $res['error']['message'] ?? 'پاسخ AI دریافت نشد';
            return [ 'success' => false, 'message' => $err ];
        }

        $suggestions = self::extract_product_suggestions( $reply, $catalog );
        return [
            'success'     => true,
            'reply'       => $reply,
            'engine'      => 'llm',
            'model'       => $cfg['model'],
            'suggestions' => $suggestions,
        ];
    }

    public static function rule_based_reply( string $message, array $catalog, string $mizaj_type = '' ): array {
        $q = mb_strtolower( $message );
        $suggestions = [];

        if ( $mizaj_type && preg_match( '/(مزاج|مناسب من|پیشنهاد)/u', $q ) ) {
            require_once ACC_PATH . 'includes/helpers/arag-mizaj.php';
            $products = Arag_Mizaj::recommend_products( $mizaj_type );
            $prof = Arag_Mizaj::profile( $mizaj_type );
            $names = implode( '، ', array_map( static fn( $p ) => $p['name'], $products ) );
            return [
                'success' => true,
                'reply'   => "بر اساس مزاج {$mizaj_type} شما:\n{$prof['summary']}\n\nپیشنهاد: {$names}\n\nکد MAZAJ15 — ۱۵٪ تخفیف",
                'engine'  => 'rules',
                'suggestions' => array_map( static function ( $p ) {
                    return [
                        'id' => 0, 'name' => $p['name'], 'slug' => $p['slug'],
                        'min_price' => $p['price'], 'packages' => [],
                    ];
                }, $products ),
            ];
        }

        if ( preg_match( '/(سلام|درود|hello|hi)/u', $q ) ) {
            return [
                'success' => true,
                'reply'   => "سلام! 🌿 من مشاور فروش عرقیات هستم.\nمی‌تونم در انتخاب عرق (گلاب، بیدمشک، کاسنی و...)، قیمت، ارسال و کد تخفیف کمکتون کنم.\nچی مدنظرتونه؟",
                'engine'  => 'rules',
                'suggestions' => array_slice( $catalog, 0, 3 ),
            ];
        }

        if ( preg_match( '/(تخفیف|کوپن|کد)/u', $q ) ) {
            return [
                'success' => true,
                'reply'   => "کدهای فعال:\n• ARAG10 — ۱۰٪ تخفیف\n• ARAG15 — ۱۵٪ (حداقل ۵۰۰ هزار تومان)\n• WELCOME20 — ۲۰٪ (حداقل ۱ میلیون)\n\nدر صفحه پرداخت کد را وارد کنید.",
                'engine'  => 'rules',
                'suggestions' => [],
            ];
        }

        if ( preg_match( '/(ارسال|پست|تیپاکس|تحویل)/u', $q ) ) {
            return [
                'success' => true,
                'reply'   => "ارسال سراسری با پست پیشتاز یا تیپاکس انجام می‌شود.\nکرایه پس‌پرداخت است. تحویل حضوری هم از فروشگاه ممکن است.",
                'engine'  => 'rules',
                'suggestions' => [],
            ];
        }

        if ( preg_match( '/(پیگیری|سفارش|کد سفارش)/u', $q ) ) {
            return [
                'success' => true,
                'reply'   => "برای پیگیری سفارش، شماره سفارش و موبایل را در بخش «پیگیری» وارد کنید یا از آیکون 📦 پایین صفحه استفاده کنید.",
                'engine'  => 'rules',
                'suggestions' => [],
            ];
        }

        $keywords = [
            'گلاب' => 'golab', 'golab' => 'golab',
            'بیدمشک' => 'bidmeshk', 'bidmeshk' => 'bidmeshk',
            'کاسنی' => 'kasni', 'kasni' => 'kasni',
            'نعنا' => 'naana', 'naana' => 'naana',
        ];
        foreach ( $keywords as $kw => $slug ) {
            if ( mb_strpos( $q, $kw ) !== false ) {
                foreach ( $catalog as $p ) {
                    if ( $p['slug'] === $slug ) {
                        $suggestions[] = $p;
                        $price = number_format( (float) $p['min_price'] );
                        $pkg = $p['packages'][0] ?? null;
                        $pkgTxt = $pkg ? "\nبسته نمونه: {$pkg['label']} — " . number_format( $pkg['price'] ) . ' تومان' : '';
                        return [
                            'success' => true,
                            'reply'   => "🌿 **{$p['name']}**\n{$p['tagline']}\nاز {$price} تومان{$pkgTxt}\n\nبرای خرید: shop.php?p={$slug}",
                            'engine'  => 'rules',
                            'suggestions' => [ $p ],
                        ];
                    }
                }
            }
        }

        if ( preg_match( '/(ارزان|اقتصادی|کمترین قیمت)/u', $q ) ) {
            usort( $catalog, static fn( $a, $b ) => ( $a['min_price'] ?? 0 ) <=> ( $b['min_price'] ?? 0 ) );
            $suggestions = array_slice( $catalog, 0, 3 );
            $lines = array_map( static function ( $p ) {
                return "• {$p['name']} از " . number_format( (float) $p['min_price'] ) . ' تومان';
            }, $suggestions );
            return [
                'success' => true,
                'reply'   => "اقتصادی‌ترین گزینه‌ها:\n" . implode( "\n", $lines ),
                'engine'  => 'rules',
                'suggestions' => $suggestions,
            ];
        }

        if ( preg_match( '/(هدیه|پذیرایی|مهمانی)/u', $q ) ) {
            foreach ( $catalog as $p ) {
                if ( $p['slug'] === 'golab' || $p['slug'] === 'bidmeshk' ) {
                    $suggestions[] = $p;
                }
            }
            return [
                'success' => true,
                'reply'   => "برای هدیه و پذیرایی معمولاً گلاب و بیدمشک پیشنهاد می‌شود — عطر طبیعی و بسته‌بندی شیک.\nروی محصول کلیک کنید و مدل/حجم را انتخاب کنید.",
                'engine'  => 'rules',
                'suggestions' => $suggestions,
            ];
        }

        $suggestions = array_slice( $catalog, 0, 4 );
        $names = implode( '، ', array_map( static fn( $p ) => $p['name'], $suggestions ) );
        return [
            'success' => true,
            'reply'   => "محصولات ما: {$names} و بیشتر.\nلطفاً بگویید دنبال چه عطری هستید (مثلاً گلاب برای شربت، کاسنی برای طب سنتی) تا دقیق‌تر راهنمایی کنم.",
            'engine'  => 'rules',
            'suggestions' => $suggestions,
        ];
    }

    public static function extract_product_suggestions( string $reply, array $catalog ): array {
        $found = [];
        foreach ( $catalog as $p ) {
            if ( mb_strpos( $reply, $p['name'] ) !== false || mb_strpos( $reply, $p['slug'] ) !== false ) {
                $found[] = $p;
            }
        }
        return array_slice( $found, 0, 3 );
    }

    public static function log_table(): string {
        global $wpdb;
        return $wpdb->prefix . 'arag_ai_chat_log';
    }

    public static function log_exchange( string $session_id, string $user_msg, string $bot_msg, string $engine ): void {
        global $wpdb;
        $t = self::log_table();
        if ( $wpdb->get_var( "SHOW TABLES LIKE '{$t}'" ) !== $t ) {
            return;
        }
        $wpdb->insert( $t, [
            'session_id' => substr( sanitize_text_field( $session_id ?: 'anon' ), 0, 64 ),
            'user_msg'   => $user_msg,
            'bot_msg'    => $bot_msg,
            'engine'     => $engine,
            'created_at' => current_time( 'mysql' ),
        ] );
    }

    private static function _http_post( string $url, string $body, array $headers ): array {
        if ( function_exists( 'wp_remote_post' ) ) {
            $h = [];
            foreach ( $headers as $line ) {
                $p = explode( ':', $line, 2 );
                if ( count( $p ) === 2 ) {
                    $h[ trim( $p[0] ) ] = trim( $p[1] );
                }
            }
            $resp = wp_remote_post( $url, [
                'headers' => $h,
                'body'    => $body,
                'timeout' => 45,
            ] );
            if ( is_wp_error( $resp ) ) {
                return [ 'error' => [ 'message' => $resp->get_error_message() ] ];
            }
            return json_decode( wp_remote_retrieve_body( $resp ), true ) ?: [];
        }
        $ch = curl_init( $url );
        curl_setopt_array( $ch, [
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => $body,
            CURLOPT_HTTPHEADER     => $headers,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT        => 45,
        ] );
        $raw = curl_exec( $ch );
        curl_close( $ch );
        return json_decode( (string) $raw, true ) ?: [];
    }
}
