<?php
/**
 * Arag_Mizaj — تست مزاج‌شناسی طب سنتی + پیشنهاد عرقیات
 */
if ( ! defined( 'ABSPATH' ) ) exit;

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

class Arag_Mizaj {

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

    public static function questions(): array {
        return [
            [
                'id' => 'body_temp', 'section' => 'جسمی', 'text' => 'دست‌ها و پوستتان معمولاً…',
                'options' => [
                    [ 'id' => 'hot',  'label' => 'گرم و مرطوب', 'scores' => [ 'hot' => 2, 'wet' => 1 ] ],
                    [ 'id' => 'cold', 'label' => 'سرد',         'scores' => [ 'cold' => 2, 'wet' => 1 ] ],
                    [ 'id' => 'dry',  'label' => 'گرم و خشک',   'scores' => [ 'hot' => 2, 'dry' => 2 ] ],
                    [ 'id' => 'mix',  'label' => 'متغیر',       'scores' => [ 'hot' => 1, 'cold' => 1 ] ],
                ],
            ],
            [
                'id' => 'complexion', 'section' => 'جسمی', 'text' => 'رنگ چهره شما بیشتر…',
                'options' => [
                    [ 'id' => 'ruddy',  'label' => 'سرخ و شاداب',     'scores' => [ 'hot' => 2, 'wet' => 1 ] ],
                    [ 'id' => 'pale',   'label' => 'روشن و کم‌رنگ',   'scores' => [ 'cold' => 2, 'wet' => 1 ] ],
                    [ 'id' => 'yellow', 'label' => 'مایل به زرد',     'scores' => [ 'hot' => 2, 'dry' => 1 ] ],
                    [ 'id' => 'dark',   'label' => 'تیره و خشک',      'scores' => [ 'cold' => 1, 'dry' => 2 ] ],
                ],
            ],
            [
                'id' => 'body_build', 'section' => 'جسمی', 'text' => 'اندام و وزن شما…',
                'options' => [
                    [ 'id' => 'medium', 'label' => 'متوسط و متناسب', 'scores' => [ 'hot' => 1, 'wet' => 1 ] ],
                    [ 'id' => 'heavy',  'label' => 'درشت و سنگین',   'scores' => [ 'cold' => 2, 'wet' => 2 ] ],
                    [ 'id' => 'lean',   'label' => 'لاغر و کشیده',   'scores' => [ 'hot' => 1, 'dry' => 2 ] ],
                    [ 'id' => 'thin',   'label' => 'باریک و کم‌وزن', 'scores' => [ 'cold' => 1, 'dry' => 2 ] ],
                ],
            ],
            [
                'id' => 'skin', 'section' => 'جسمی', 'text' => 'پوست شما معمولاً…',
                'options' => [
                    [ 'id' => 'soft',  'label' => 'نرم و مرطوب',  'scores' => [ 'wet' => 2 ] ],
                    [ 'id' => 'dry',   'label' => 'خشک و زبر',    'scores' => [ 'dry' => 2, 'cold' => 1 ] ],
                    [ 'id' => 'oily',  'label' => 'چرب و گرم',    'scores' => [ 'hot' => 1, 'wet' => 1 ] ],
                    [ 'id' => 'mixed', 'label' => 'ترکیبی',       'scores' => [ 'hot' => 1, 'cold' => 1 ] ],
                ],
            ],
            [
                'id' => 'hair', 'section' => 'جسمی', 'text' => 'موهای شما…',
                'options' => [
                    [ 'id' => 'thick', 'label' => 'ضخیم و پرپشت', 'scores' => [ 'hot' => 1, 'wet' => 1 ] ],
                    [ 'id' => 'thin',  'label' => 'نازک و کم‌پشت', 'scores' => [ 'cold' => 1, 'dry' => 1 ] ],
                    [ 'id' => 'dry_h', 'label' => 'خشک و وز',     'scores' => [ 'dry' => 2 ] ],
                    [ 'id' => 'oily_h','label' => 'چرب و سریع چرب می‌شود', 'scores' => [ 'hot' => 1, 'wet' => 1 ] ],
                ],
            ],
            [
                'id' => 'appetite', 'section' => 'گوارش', 'text' => 'اشتهای شما…',
                'options' => [
                    [ 'id' => 'strong', 'label' => 'قوی و سریع گرسنه می‌شوم', 'scores' => [ 'hot' => 2 ] ],
                    [ 'id' => 'weak',   'label' => 'ضعیف و کم‌اشتها',         'scores' => [ 'cold' => 2, 'wet' => 1 ] ],
                    [ 'id' => 'irreg',  'label' => 'نامنظم',                  'scores' => [ 'dry' => 1, 'hot' => 1 ] ],
                    [ 'id' => 'sweet',  'label' => 'میل زیاد به شیرینی',      'scores' => [ 'cold' => 1, 'wet' => 2 ] ],
                ],
            ],
            [
                'id' => 'digest', 'section' => 'گوارش', 'text' => 'بعد از غذا معمولاً…',
                'options' => [
                    [ 'id' => 'light',  'label' => 'سبک و راحت هضم می‌شود', 'scores' => [ 'hot' => 1 ] ],
                    [ 'id' => 'heavy',  'label' => 'احساس سنگینی و نفخ',    'scores' => [ 'cold' => 2, 'wet' => 2 ] ],
                    [ 'id' => 'burn',   'label' => 'سوزش یا تندی معده',     'scores' => [ 'hot' => 2, 'dry' => 1 ] ],
                    [ 'id' => 'bloat',  'label' => 'نفخ و یبوست متناوب',    'scores' => [ 'dry' => 2, 'cold' => 1 ] ],
                ],
            ],
            [
                'id' => 'thirst', 'section' => 'گوارش', 'text' => 'تشنگی شما…',
                'options' => [
                    [ 'id' => 'much',   'label' => 'زیاد و میل به آب سرد', 'scores' => [ 'hot' => 2, 'dry' => 1 ] ],
                    [ 'id' => 'little', 'label' => 'کم و میل به نوشیدنی گرم', 'scores' => [ 'cold' => 2 ] ],
                    [ 'id' => 'normal', 'label' => 'معمولی',               'scores' => [ 'wet' => 1 ] ],
                    [ 'id' => 'dry_m',  'label' => 'دهان خشک',             'scores' => [ 'dry' => 2 ] ],
                ],
            ],
            [
                'id' => 'sleep', 'section' => 'خواب', 'text' => 'خواب شما…',
                'options' => [
                    [ 'id' => 'light',  'label' => 'سبک — زود بیدار می‌شوم', 'scores' => [ 'hot' => 2, 'dry' => 1 ] ],
                    [ 'id' => 'deep',   'label' => 'سنگین — سخت بیدار می‌شوم', 'scores' => [ 'cold' => 2, 'wet' => 2 ] ],
                    [ 'id' => 'insomnia','label' => 'بی‌خوابی یا فکر زیاد',   'scores' => [ 'dry' => 2, 'hot' => 1 ] ],
                    [ 'id' => 'ok',     'label' => 'معمولاً خوب',            'scores' => [ 'wet' => 1 ] ],
                ],
            ],
            [
                'id' => 'mood', 'section' => 'روان', 'text' => 'خلق و خوی روزمره…',
                'options' => [
                    [ 'id' => 'social', 'label' => 'اجتماعی، شاد و پرانرژی', 'scores' => [ 'hot' => 2, 'wet' => 1 ] ],
                    [ 'id' => 'calm',   'label' => 'آرام، کم‌حرف و صبور',    'scores' => [ 'cold' => 2, 'wet' => 1 ] ],
                    [ 'id' => 'irritable','label' => 'تندخو و عجول',         'scores' => [ 'hot' => 2, 'dry' => 2 ] ],
                    [ 'id' => 'anxious','label' => 'نگران و درون‌گرا',       'scores' => [ 'cold' => 1, 'dry' => 2 ] ],
                ],
            ],
            [
                'id' => 'energy', 'section' => 'روان', 'text' => 'سطح انرژی در طول روز…',
                'options' => [
                    [ 'id' => 'high',  'label' => 'بالا و پایدار',     'scores' => [ 'hot' => 2, 'wet' => 1 ] ],
                    [ 'id' => 'low',   'label' => 'پایین و کند',       'scores' => [ 'cold' => 2, 'wet' => 1 ] ],
                    [ 'id' => 'burst', 'label' => 'موجی — بالا و پایین', 'scores' => [ 'hot' => 1, 'dry' => 1 ] ],
                    [ 'id' => 'tired', 'label' => 'خستگی مزمن',        'scores' => [ 'cold' => 1, 'dry' => 2 ] ],
                ],
            ],
            [
                'id' => 'season_hot', 'section' => 'فصل', 'text' => 'تابستان برایتان…',
                'options' => [
                    [ 'id' => 'hard',  'label' => 'سخت — گرما اذیت می‌کند', 'scores' => [ 'hot' => 2 ] ],
                    [ 'id' => 'ok',    'label' => 'قابل تحمل',            'scores' => [ 'wet' => 1 ] ],
                    [ 'id' => 'good',  'label' => 'خوب — گرما را دوست دارم', 'scores' => [ 'cold' => 1 ] ],
                    [ 'id' => 'neutral','label' => 'فرقی نمی‌کند',          'scores' => [] ],
                ],
            ],
            [
                'id' => 'season_cold', 'section' => 'فصل', 'text' => 'زمستان برایتان…',
                'options' => [
                    [ 'id' => 'hard',  'label' => 'سخت — سرما اذیت می‌کند', 'scores' => [ 'cold' => 2 ] ],
                    [ 'id' => 'ok',    'label' => 'قابل تحمل',             'scores' => [ 'hot' => 1 ] ],
                    [ 'id' => 'good',  'label' => 'خوب — سرما را دوست دارم', 'scores' => [ 'hot' => 2 ] ],
                    [ 'id' => 'neutral','label' => 'فرقی نمی‌کند',           'scores' => [] ],
                ],
            ],
            [
                'id' => 'food_pref', 'section' => 'خوراک', 'text' => 'بیشتر میل دارید…',
                'options' => [
                    [ 'id' => 'warm_f', 'label' => 'غذای گرم و پرادویه', 'scores' => [ 'cold' => 2 ] ],
                    [ 'id' => 'cold_f', 'label' => 'غذای سرد و سبک',     'scores' => [ 'hot' => 2 ] ],
                    [ 'id' => 'sweet_f','label' => 'شیرینی و لبنیات',    'scores' => [ 'cold' => 1, 'wet' => 2 ] ],
                    [ 'id' => 'dry_f',  'label' => 'خشکبار و نان',       'scores' => [ 'dry' => 2 ] ],
                ],
            ],
            [
                'id' => 'symptom', 'section' => 'علائم', 'text' => 'کدام علامت بیشتر به شما می‌خورد؟',
                'options' => [
                    [ 'id' => 'flush',  'label' => 'گرگرفتگی و تعریق',  'scores' => [ 'hot' => 2 ] ],
                    [ 'id' => 'mucus',  'label' => 'سردی و رطوبت (آبریزش)', 'scores' => [ 'cold' => 2, 'wet' => 2 ] ],
                    [ 'id' => 'headache','label' => 'سردرد و تندی',      'scores' => [ 'hot' => 2, 'dry' => 1 ] ],
                    [ 'id' => 'dryness','label' => 'خشکی پوست/یبوست',   'scores' => [ 'dry' => 2, 'cold' => 1 ] ],
                ],
            ],
        ];
    }

    public static function score_answers( array $answers ): array {
        $totals = [ 'hot' => 0, 'cold' => 0, 'wet' => 0, 'dry' => 0 ];
        $qmap = [];
        foreach ( self::questions() as $q ) {
            $qmap[ $q['id'] ] = $q;
        }
        foreach ( $answers as $qid => $oid ) {
            $q = $qmap[ $qid ] ?? null;
            if ( ! $q ) continue;
            foreach ( $q['options'] as $opt ) {
                if ( $opt['id'] === $oid ) {
                    foreach ( $opt['scores'] ?? [] as $k => $v ) {
                        $totals[ $k ] = ( $totals[ $k ] ?? 0 ) + (int) $v;
                    }
                    break;
                }
            }
        }
        return $totals;
    }

    public static function resolve_type( array $scores ): array {
        $hot  = (int) ( $scores['hot'] ?? 0 );
        $cold = (int) ( $scores['cold'] ?? 0 );
        $wet  = (int) ( $scores['wet'] ?? 0 );
        $dry  = (int) ( $scores['dry'] ?? 0 );

        $temp = $hot >= $cold ? 'hot' : 'cold';
        $moist = $wet >= $dry ? 'wet' : 'dry';

        $key = $temp . '_' . $moist;
        $map = [
            'hot_wet'  => [ 'type' => 'dam',     'label' => 'دموی (گرم و تر)',     'icon' => '🌹', 'color' => '#e11d48' ],
            'cold_wet' => [ 'type' => 'balgham', 'label' => 'بلغمی (سرد و تر)',    'icon' => '💧', 'color' => '#3b82f6' ],
            'hot_dry'  => [ 'type' => 'safra',   'label' => 'صفراوی (گرم و خشک)',  'icon' => '☀️', 'color' => '#f59e0b' ],
            'cold_dry' => [ 'type' => 'souda',   'label' => 'سوداوی (سرد و خشک)',  'icon' => '🌙', 'color' => '#6366f1' ],
        ];
        $base = $map[ $key ] ?? $map['hot_dry'];
        $intensity = max( $hot + $cold + $wet + $dry, 1 );
        $dom = max( $hot, $cold, $wet, $dry );
        $level = $dom >= 12 ? 'شدید' : ( $dom >= 8 ? 'متوسط' : 'خفیف' );

        return array_merge( $base, [
            'scores'    => $scores,
            'intensity' => $level,
            'axes'      => [
                'temp'  => $temp === 'hot' ? 'گرم' : 'سرد',
                'moist' => $moist === 'wet' ? 'تر' : 'خشک',
            ],
        ] );
    }

    public static function profile( string $type ): array {
        $profiles = [
            'dam' => [
                'summary'   => 'مزاج گرم و تر — پرانرژی، اجتماعی، پوست سرخ و مرطوب.',
                'foods_ok'  => [ 'سبزیجات', 'ماست', 'سیب', 'عدس', 'کدو' ],
                'foods_no'  => [ 'گوشت قرمز زیاد', 'ادویه تند', 'غذای شب دیر', 'قهوه زیاد' ],
                'lifestyle' => [ 'خواب منظم', 'پیاده‌روی شبان', 'کاهش غذای چرب', 'مدیتیشن کوتاه' ],
                'season'    => 'تابستان: عرقیات سردکننده بیشتر · زمستان: متعادل',
            ],
            'balgham' => [
                'summary'   => 'مزاج سرد و تر — آرام، کند، تمایل به سردی و رطوبت.',
                'foods_ok'  => [ 'زنجبیل', 'دارچین', 'عسل', 'سوپ گرم', 'گوشت سفید' ],
                'foods_no'  => [ 'لبنیات سرد', 'برنج زیاد', 'آب یخ', 'غذای خام' ],
                'lifestyle' => [ 'فعالیت بدنی منظم', 'کمتر خواب روز', 'حمام آب گرم', 'ورزش سبک' ],
                'season'    => 'بهار: گرم‌کننده ملایم · پاییز: مراقب سردی',
            ],
            'safra' => [
                'summary'   => 'مزاج گرم و خشک — تند، سریع، لاغراندام، حساس به گرما.',
                'foods_ok'  => [ 'غذای تر', 'میوه آبدار', 'برنج', 'کدو', 'گوشت سفید' ],
                'foods_no'  => [ 'سرخ‌کردنی', 'ادویه تند', 'غذای خشک', 'استرس' ],
                'lifestyle' => [ 'خواب کافی', 'کاهش عجله', 'پیاده‌روی', 'آرامش ذهن' ],
                'season'    => 'تابستان: سخت‌ترین فصل — گلاب و کاسنی توصیه می‌شود',
            ],
            'souda' => [
                'summary'   => 'مزاج سرد و خشک — عمیق، درون‌گرا، پوست خشک، اضطراب خفیف.',
                'foods_ok'  => [ 'عسل', 'آجیل', 'غذای گرم', 'شیر و خرما', 'ماهی' ],
                'foods_no'  => [ 'غذای خشک', 'تنهایی', 'شب‌زنده‌داری', 'کافئین زیاد' ],
                'lifestyle' => [ 'نور آفتاب', 'معاشرت', 'ورزش سبک', 'خواب منظم' ],
                'season'    => 'زمستان: گرم‌کننده · تابستان: رطوبت‌بخش',
            ],
        ];
        return $profiles[ $type ] ?? $profiles['safra'];
    }

    public static function product_map(): array {
        return [
            'dam'     => [ 'golab', 'kasni', 'naana' ],
            'balgham' => [ 'bidmeshk', 'naana', 'golab' ],
            'safra'   => [ 'golab', 'kasni', 'bidmeshk' ],
            'souda'   => [ 'bidmeshk', 'golab', 'kasni' ],
        ];
    }

    public static function distillate_tips(): array {
        return [
            'golab'    => 'سردکننده — مناسب مزاج گرم، آرامش و رطوبت',
            'bidmeshk' => 'آرام‌بخش — مناسب سودا و بلغم، قبل از خواب',
            'kasni'    => 'ملین کبد — مناسب صفرا و گرم',
            'naana'    => 'هضم — بعد از غذا، سبک‌کننده',
        ];
    }

    public static function wellness_calendar(): array {
        return [
            [ 'season' => 'بهار', 'tip' => 'گلاب صبح‌ها — شادابی و پاکسازی', 'products' => [ 'golab' ] ],
            [ 'season' => 'تابستان', 'tip' => 'کاسنی + گلاب — خنک‌کننده طبیعی', 'products' => [ 'golab', 'kasni' ] ],
            [ 'season' => 'پاییز', 'tip' => 'بیدمشک — آرامش و تعادل', 'products' => [ 'bidmeshk' ] ],
            [ 'season' => 'زمستان', 'tip' => 'نعناع گرم + عسل — گرم‌کننده ملایم', 'products' => [ 'naana' ] ],
        ];
    }

    public static function recommend_products( string $type ): array {
        $slugs = self::product_map()[ $type ] ?? [ 'golab', 'bidmeshk' ];
        $site  = rtrim( defined( 'ACC_URL' ) ? ACC_URL : '/acc-engine/', '/' );
        $out   = [];
        foreach ( $slugs as $slug ) {
            $p = Arag_Shop::get_family_by_slug( $slug );
            if ( ! $p ) continue;
            $min = (float) ( $p['min_price'] ?? 0 );
            if ( $min <= 0 ) {
                foreach ( $p['variants'] ?? [] as $v ) {
                    foreach ( $v['packages'] ?? [] as $pkg ) {
                        $pr = (float) ( $pkg['price'] ?? 0 );
                        if ( $pr > 0 && ( $min <= 0 || $pr < $min ) ) $min = $pr;
                    }
                }
            }
            $out[] = [
                'name'    => $p['name'],
                'slug'    => $slug,
                'tagline' => $p['tagline'] ?? '',
                'price'   => $min,
                'image'   => $p['bottle_image_url'] ?? $p['image_url'] ?? '',
                'url'     => $site . '/shop.php?p=' . rawurlencode( $slug ),
                'tip'     => self::distillate_tips()[ $slug ] ?? '',
            ];
        }
        return $out;
    }

    public static function build_result( array $answers, string $session_key = '', string $phone = '' ): array {
        $scores = self::score_answers( $answers );
        $resolved = self::resolve_type( $scores );
        $type = $resolved['type'];
        $profile = self::profile( $type );
        $products = self::recommend_products( $type );
        $coupon = 'MAZAJ15';

        if ( $session_key ) {
            self::save_session( $session_key, $answers, $scores, $resolved, $phone, $coupon );
        }

        return [
            'success'   => true,
            'type'      => $type,
            'label'     => $resolved['label'],
            'icon'      => $resolved['icon'],
            'color'     => $resolved['color'],
            'intensity' => $resolved['intensity'],
            'axes'      => $resolved['axes'],
            'scores'    => $scores,
            'profile'   => $profile,
            'products'  => $products,
            'calendar'  => self::wellness_calendar(),
            'coupon'    => $coupon,
            'coupon_desc' => '۱۵٪ تخفیف پکیج مزاج — حداقل ۳۰۰ هزار تومان',
            'disclaimer' => 'این تست آموزشی-سلامتی است و جایگزین تشخیص پزشک یا حکیم نیست.',
            'plan_30'   => self::plan_30_days( $type ),
        ];
    }

    public static function plan_30_days( string $type ): array {
        $plans = [
            'dam'     => [ 'هفته ۱: گلاب صبح ناشتا', 'هفته ۲: کاهش غذای گرم', 'هفته ۳: کاسنی عصر', 'هفته ۴: خواب منظم' ],
            'balgham' => [ 'هفته ۱: نعناع بعد غذا', 'هفته ۲: ورزش سبک روزانه', 'هفته ۳: بیدمشک شب', 'هفته ۴: غذای گرم' ],
            'safra'   => [ 'هفته ۱: گلاب + کاسنی', 'هفته ۲: کمتر تند و سرخ', 'هفته ۳: مدیتیشن', 'هفته ۴: خواب زود' ],
            'souda'   => [ 'هفته ۱: بیدمشک قبل خواب', 'هفته ۲: پیاده‌روی آفتاب', 'هفته ۳: گلاب ظهر', 'هفته ۴: معاشرت' ],
        ];
        return $plans[ $type ] ?? $plans['safra'];
    }

    public static function save_session( string $session_key, array $answers, array $scores, array $resolved, string $phone, string $coupon ): void {
        global $wpdb;
        $t = self::sessions_table();
        if ( $wpdb->get_var( "SHOW TABLES LIKE '{$t}'" ) !== $t ) {
            return;
        }
        $existing = (int) $wpdb->get_var( $wpdb->prepare(
            "SELECT id FROM {$t} WHERE session_key = %s", $session_key
        ) );
        $row = [
            'phone'        => sanitize_text_field( $phone ),
            'answers_json' => wp_json_encode( $answers, JSON_UNESCAPED_UNICODE ),
            'scores_json'  => wp_json_encode( $scores, JSON_UNESCAPED_UNICODE ),
            'result_type'  => $resolved['type'],
            'result_label' => $resolved['label'],
            'coupon_code'  => $coupon,
        ];
        if ( $existing ) {
            $wpdb->update( $t, $row, [ 'id' => $existing ] );
        } else {
            $wpdb->insert( $t, array_merge( $row, [ 'session_key' => substr( sanitize_text_field( $session_key ), 0, 64 ) ] ) );
        }
    }

    public static function get_session( string $session_key ): ?array {
        global $wpdb;
        $t = self::sessions_table();
        $row = $wpdb->get_row( $wpdb->prepare(
            "SELECT * FROM {$t} WHERE session_key = %s LIMIT 1", $session_key
        ), ARRAY_A );
        return $row ?: null;
    }
}
