<?php
/**
 * Melk_Advisory_AI — مشاور هوشمند مالیات و حقوق ملک
 */
if ( ! defined( 'ABSPATH' ) ) exit;

require_once ACC_PATH . 'includes/helpers/melk-advisory-knowledge.php';
require_once ACC_PATH . 'includes/helpers/melk-advisory.php';

class Melk_Advisory_AI {

    public static function config(): array {
        $melk_key = (string) get_option( 'acc_melk_ai_api_key', '' );
        $shop_key = (string) get_option( 'acc_shop_ai_api_key', '' );
        return [
            'enabled'  => get_option( 'acc_melk_ai_enabled', '1' ) === '1',
            'api_key'  => $melk_key !== '' ? $melk_key : $shop_key,
            'base_url' => rtrim( (string) get_option(
                'acc_melk_ai_base_url',
                get_option( 'acc_shop_ai_base_url', 'https://api.openai.com/v1' )
            ), '/' ),
            'model'    => (string) get_option(
                'acc_melk_ai_model',
                get_option( 'acc_shop_ai_model', 'gpt-4o-mini' )
            ),
            'source'   => $melk_key !== '' ? 'melk' : ( $shop_key !== '' ? 'shop_fallback' : 'none' ),
        ];
    }

    public static function status(): array {
        $cfg = self::config();
        return [
            'enabled'  => $cfg['enabled'],
            'has_llm'  => $cfg['enabled'] && $cfg['api_key'] !== '',
            'model'    => $cfg['model'],
            'source'   => $cfg['source'],
            'disclaimer' => self::disclaimer(),
        ];
    }

    public static function disclaimer(): string {
        return (string) get_option( 'acc_melk_ai_disclaimer',
            'این مشاوره جنبه آموزشی دارد و جایگزین مشاوره رسمی وکیل یا ممیز مالیاتی نیست. برای تصمیمات binding با متخصصان رسمی مشورت کنید.'
        );
    }

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

        $topic   = sanitize_key( $opts['topic'] ?? 'both' );
        $context = is_array( $opts['context'] ?? null ) ? $opts['context'] : [];
        $session_id = (int) ( $opts['session_id'] ?? 0 );

        if ( ! $session_id ) {
            $session_id = Melk_Advisory::create_session( $user_id, [
                'topic'      => $topic,
                'title'      => mb_substr( $message, 0, 80 ),
                'case_id'    => $context['case_id'] ?? null,
                'listing_id' => $context['listing_id'] ?? null,
            ] );
        } elseif ( ! Melk_Advisory::get_session( $session_id, $user_id ) ) {
            return [ 'success' => false, 'message' => 'جلسه یافت نشد' ];
        }

        Melk_Advisory::add_message( $session_id, 'user', $message, 'user' );

        $cfg = self::config();
        $reply_data = null;

        if ( $cfg['enabled'] && $cfg['api_key'] ) {
            $llm = self::llm_reply( $message, $history, $topic, $context, $cfg );
            if ( ! empty( $llm['success'] ) ) {
                $reply_data = $llm;
            }
        }

        if ( ! $reply_data ) {
            $reply_data = self::rule_based_reply( $message, $topic, $context );
        }

        Melk_Advisory::add_message(
            $session_id,
            'assistant',
            $reply_data['reply'],
            $reply_data['engine'] ?? 'rules',
            $reply_data['model'] ?? null
        );

        $related = self::related_articles( $message, $topic );

        return array_merge( $reply_data, [
            'session_id' => $session_id,
            'related'    => $related,
            'disclaimer' => self::disclaimer(),
        ] );
    }

    public static function llm_reply( string $message, array $history, string $topic, array $context, ?array $cfg = null ): array {
        $cfg = $cfg ?: self::config();
        $kb  = Melk_Advisory_Knowledge::build_ai_context();
        $tx  = Melk_Advisory::build_transaction_context( $context );
        $disc = self::disclaimer();

        $focus = match ( $topic ) {
            'tax'    => 'تمرکز: مالیات‌های حوزه ملک ایران (عایدی، نقل و انتقال، اجاره، عوارض، ارزش افزوده، ارث، مشارکت).',
            'legal'  => 'تمرکز: حقوق ملک ایران (سند، قرارداد، مشارکت، اجاره، ثبت، شهرداری، اختلافات).',
            default  => 'تمرکز: هر دو حوزه مالیات و حقوق ملک ایران.',
        };

        $system = <<<SYS
شما «مشاور مالیات و حقوق املاک» در سامانه اقتصاد ملک شیراز هستید.
{$focus}

قوانین پاسخ:
- فقط فارسی، حرفه‌ای، ساختاریافته و قابل فهم برای سرمایه‌گذار/مالک.
- از بانک دانش زیر استفاده کنید؛ اگر مطمئن نیستید صادقانه بگویید.
- همیشه یادآوری کنید: «{$disc}»
- برای معاملات واقعی: چک‌لیست استعلام (ثبت، شهرداری، مالیات) پیشنهاد دهید.
- نرخ دقیق مالیات را اگر در دانش نیست، بگویید «طبق جدول مصوب سازمان امور مالیاتی — استعلام رسمی لازم است».
- از markdown ساده (**bold**) استفاده کنید.

{$kb}

--- زمینه معامله کاربر ---
{$tx}
SYS;

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

        $res = self::_http_post( $cfg['base_url'] . '/chat/completions', wp_json_encode( [
            'model'       => $cfg['model'],
            'messages'    => $messages,
            'temperature' => 0.35,
            'max_tokens'  => 900,
        ] ), [
            'Authorization: Bearer ' . $cfg['api_key'],
            'Content-Type: application/json',
        ] );

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

        return [
            'success' => true,
            'reply'   => $reply,
            'engine'  => 'llm',
            'model'   => $cfg['model'],
        ];
    }

    public static function rule_based_reply( string $message, string $topic, array $context ): array {
        $q = mb_strtolower( $message );
        $search = Melk_Advisory_Knowledge::search( $message, $topic === 'both' ? 'all' : $topic );

        if ( preg_match( '/(سلام|درود|hello)/u', $q ) ) {
            return [
                'success' => true,
                'reply'   => "سلام! 📑 من مشاور مالیات و حقوق ملک هستم.\n\nمی‌توانم درباره **مالیات فروش، اجاره، عوارض شهرداری، مشارکت در ساخت** و **قرارداد، سند، استعلام ثبت و شهرداری** راهنمایی کنم.\n\n⚠️ " . self::disclaimer(),
                'engine'  => 'rules',
            ];
        }

        $hits = array_merge( $search['tax'] ?? [], $search['legal'] ?? [] );
        if ( $hits ) {
            $parts = [];
            foreach ( array_slice( $hits, 0, 2 ) as $h ) {
                $full = isset( $search['tax'] ) && in_array( $h, $search['tax'], true )
                    ? Melk_Advisory_Knowledge::get_tax( $h['key'] )
                    : Melk_Advisory_Knowledge::get_legal( $h['key'] );
                if ( ! $full ) continue;
                $parts[] = "**{$full['title']}**\n{$full['summary']}";
                if ( ! empty( $full['obligations'] ) ) {
                    $parts[] = "• تعهدات: " . implode( '؛ ', array_slice( $full['obligations'], 0, 3 ) );
                }
                if ( ! empty( $full['points'] ) ) {
                    $parts[] = "• نکات: " . implode( '؛ ', array_slice( $full['points'], 0, 3 ) );
                }
                if ( ! empty( $full['risks'] ) ) {
                    $parts[] = "⚠️ ریسک: " . implode( '؛ ', $full['risks'] );
                }
            }
            $parts[] = "\n⚠️ " . self::disclaimer();
            return [
                'success' => true,
                'reply'   => implode( "\n\n", $parts ),
                'engine'  => 'rules',
            ];
        }

        if ( preg_match( '/(مالیات|عوارض|عایدی|ارزش افزوده|اظهارنامه)/u', $q ) ) {
            $tax = Melk_Advisory_Knowledge::get_tax( 'capital_gains' );
            return [
                'success' => true,
                'reply'   => "**راهنمای کلی مالیات ملک**\n\n{$tax['summary']}\n\nبرای جزئیات، بخش «📊 قوانین مالیاتی» را ببینید یا سوال دقیق‌تر بپرسید.\n\n⚠️ " . self::disclaimer(),
                'engine'  => 'rules',
            ];
        }

        if ( preg_match( '/(سند|قولنامه|ثبت|وکالت|مشارکت|اجاره)/u', $q ) ) {
            $leg = Melk_Advisory_Knowledge::get_legal( 'sale_contract' );
            return [
                'success' => true,
                'reply'   => "**راهنمای کلی حقوق ملک**\n\n{$leg['summary']}\n\nبخش «⚖️ حقوق ملک» را مرور کنید.\n\n⚠️ " . self::disclaimer(),
                'engine'  => 'rules',
            ];
        }

        return [
            'success' => true,
            'reply'   => "سوال شما را دریافت کردم. لطفاً دقیق‌تر بپرسید — مثلاً:\n• مالیات فروش زمین ۱۰۰۰ متری\n• استعلام قبل از خرید\n• مالیات اجاره مغازه\n\n⚠️ " . self::disclaimer(),
            'engine'  => 'rules',
        ];
    }

    public static function related_articles( string $message, string $topic ): array {
        $search = Melk_Advisory_Knowledge::search( $message, $topic === 'both' ? 'all' : $topic );
        $out = [];
        foreach ( array_slice( array_merge( $search['tax'] ?? [], $search['legal'] ?? [] ), 0, 4 ) as $h ) {
            $out[] = $h;
        }
        return $out;
    }

    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' => 60 ] );
            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 => 60,
        ] );
        $raw = curl_exec( $ch );
        curl_close( $ch );
        return json_decode( (string) $raw, true ) ?: [];
    }
}
