<?php
declare(strict_types=1);

namespace app\common\enum {
    class Client
    {
        public const MP_WEIXIN = 'MP-WEIXIN';
    }
}

namespace app\common\model\wxapp {
    class Setting
    {
        public static function getItem(string $key): array
        {
            return [];
        }
    }
}

namespace think\facade {
    class Log
    {
        public static array $records = [];

        public static function record(string $message): void
        {
            self::$records[] = $message;
        }
    }
}

namespace {
    use app\api\service\WxappReview;
    use think\facade\Log;

    $requestContext = [
        'platform' => 'MP-WEIXIN',
        'version' => '2.0.50',
        'env_version' => 'trial',
        'store_id' => 10001,
    ];

    function getPlatform(): ?string
    {
        global $requestContext;
        return $requestContext['platform'] ?? null;
    }

    function getVersion(): ?string
    {
        global $requestContext;
        return $requestContext['version'] ?? null;
    }

    function getEnvVersion(): ?string
    {
        global $requestContext;
        return $requestContext['env_version'] ?? null;
    }

    function getStoreId(): int
    {
        global $requestContext;
        return (int)($requestContext['store_id'] ?? 0);
    }

    require_once __DIR__ . '/../../../zhctproject/ai_api/app/api/service/WxappReview.php';

    function assertSameValue($expected, $actual, string $name): void
    {
        if ($expected !== $actual) {
            fwrite(STDERR, sprintf(
                "%s failed: expected %s, got %s\n",
                $name,
                var_export($expected, true),
                var_export($actual, true)
            ));
            exit(1);
        }
    }

    function isReview(array $values, ?string $platform, ?string $version, ?string $envVersion): bool
    {
        global $requestContext;
        Log::$records = [];
        $requestContext['platform'] = $platform;
        $requestContext['version'] = $version;
        $requestContext['env_version'] = $envVersion;
        return WxappReview::isReviewMode($values);
    }

    $base = [
        'switch' => 1,
        'version' => '2.0.50',
        'platforms' => ['MP-WEIXIN'],
        'expire_time' => 0,
        'trial_show_info' => 0,
    ];

    $cases = [
        [
            'name' => 'trial_show_info=0 trial enters review even when version mismatches',
            'values' => $base,
            'platform' => 'MP-WEIXIN',
            'version' => '2.0.99',
            'env_version' => 'trial',
            'expected' => true,
        ],
        [
            'name' => 'trial_show_info=0 trial enters review even when platform header is empty',
            'values' => $base,
            'platform' => '',
            'version' => '2.0.99',
            'env_version' => 'trial',
            'expected' => true,
        ],
        [
            'name' => 'trial_show_info=0 trial enters review when version matches',
            'values' => $base,
            'platform' => 'MP-WEIXIN',
            'version' => '2.0.50',
            'env_version' => 'trial',
            'expected' => true,
        ],
        [
            'name' => 'trial_show_info=1 trial shows real info even when version matches',
            'values' => array_merge($base, ['trial_show_info' => 1]),
            'platform' => 'MP-WEIXIN',
            'version' => '2.0.50',
            'env_version' => 'trial',
            'expected' => false,
        ],
        [
            'name' => 'trial_show_info string 1 trial shows real info even when version matches',
            'values' => array_merge($base, ['trial_show_info' => '1']),
            'platform' => 'MP-WEIXIN',
            'version' => '2.0.50',
            'env_version' => 'trial',
            'expected' => false,
        ],
        [
            'name' => 'release still enters review when configured version matches',
            'values' => array_merge($base, ['trial_show_info' => 1]),
            'platform' => 'MP-WEIXIN',
            'version' => '2.0.50',
            'env_version' => 'release',
            'expected' => true,
        ],
        [
            'name' => 'release stays normal when configured version mismatches',
            'values' => $base,
            'platform' => 'MP-WEIXIN',
            'version' => '2.0.99',
            'env_version' => 'release',
            'expected' => false,
        ],
    ];

    foreach ($cases as $case) {
        assertSameValue(
            $case['expected'],
            isReview($case['values'], $case['platform'], $case['version'], $case['env_version']),
            $case['name']
        );
    }

    echo "miniapp review envVersion PHP tests passed\n";
}
