<?php
declare(strict_types=1);
/**
 * FATE 站台設定（常數／環境變數）。
 * 站台設定主檔（config/app.php）。
 */
$fateRoot = dirname(__DIR__);

/** 前台模版識別名（僅英數、底線、連字號） */
if (!defined('FATE_TEMPLATE')) {
    $normTpl = static function (string $raw): string {
        $tid = strtolower(trim($raw));

        return preg_match('/^[a-z0-9_-]{1,64}$/', $tid) === 1 ? $tid : 'default';
    };

    $envRaw = getenv('FATE_TEMPLATE');
    $envSet = is_string($envRaw) && trim($envRaw) !== '';

    if ($envSet) {
        define('FATE_TEMPLATE', $normTpl((string) $envRaw));
        define('FATE_TEMPLATE_SOURCE', 'env');
    } else {
        $picked = 'default';
        $src = 'default';
        $settingsPath = $fateRoot . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'fate_ui_settings.json';
        if (is_file($settingsPath)) {
            $j = json_decode((string) file_get_contents($settingsPath), true);
            if (is_array($j) && isset($j['template']) && is_string($j['template'])) {
                $picked = $normTpl($j['template']);
                $src = 'file';
            }
        }
        define('FATE_TEMPLATE', $picked);
        define('FATE_TEMPLATE_SOURCE', $src);
    }
}
if (!defined('FATE_TEMPLATE_SOURCE')) {
    define('FATE_TEMPLATE_SOURCE', 'custom');
}
if (!defined('FATE_SPA_API_BASE')) {
    define('FATE_SPA_API_BASE', rtrim((string) (getenv('FATE_SPA_API_BASE') ?: 'https://spa.novice.tw'), '/'));
}
if (!defined('FATE_SPA_STORE_API_KEY')) {
    require_once $fateRoot . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_api_keys.php';
    define('FATE_SPA_STORE_API_KEY', fate_api_key('spa_store_public'));
}
/** 非 CLI 呼叫 admin/sync_spa_stores.php 時必須帶的 query token（空字串則僅允許 CLI） */
if (!defined('FATE_SYNC_HTTP_TOKEN')) {
    define('FATE_SYNC_HTTP_TOKEN', (string) (getenv('FATE_SYNC_HTTP_TOKEN') ?: ''));
}
/** 會員表所在資料庫（預設與 config/db.php 的 name 相同；亦支援 FATE_MEMBER_DATABASE／FATE_DB_NAME 環境變數） */
if (!function_exists('fate_app_member_database_name')) {
    function fate_app_member_database_name(): string
    {
        if (!function_exists('fate_db_configured_database_name')) {
            require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_db_connect.php';
        }

        return fate_db_configured_database_name();
    }
}
if (!defined('FATE_MEMBER_DATABASE')) {
    define('FATE_MEMBER_DATABASE', fate_app_member_database_name());
}
/** 會員資料表名稱（欄位含 username、password、role、status 等） */
if (!defined('FATE_MEMBER_TABLE')) {
    define('FATE_MEMBER_TABLE', (string) (getenv('FATE_MEMBER_TABLE') ?: 'members'));
}
/** 新手村 N 幣來源表（預設 spa.users；FATE 會員表無 ncoin 時依 email／帳號對應） */
if (!defined('FATE_SPA_USERS_DATABASE')) {
    define('FATE_SPA_USERS_DATABASE', (string) (getenv('FATE_SPA_USERS_DATABASE') ?: 'spa'));
}
if (!defined('FATE_SPA_USERS_TABLE')) {
    define('FATE_SPA_USERS_TABLE', (string) (getenv('FATE_SPA_USERS_TABLE') ?: 'users'));
}
/**
 * 會員「啟用」欄位（數字 1＝可登入）。預設 status；若資料表為 is_active 請設環境變數 FATE_MEMBER_ACTIVE_COLUMN。
 */
if (!defined('FATE_MEMBER_ACTIVE_COLUMN')) {
    $acCol = trim((string) (getenv('FATE_MEMBER_ACTIVE_COLUMN') ?: 'status'));
    define(
        'FATE_MEMBER_ACTIVE_COLUMN',
        preg_match('/^[a-zA-Z0-9_]{1,64}$/', $acCol) === 1 ? $acCol : 'status'
    );
}
/** 關閉前台註冊 register.php（環境變數 FATE_DISABLE_PUBLIC_REGISTRATION=1／true／yes／on；由 fate_member_register.php 讀 getenv） */
/** 新會員是否須管理員人工審核後才可登入。
 *  預設由「後台 → 驗證信與發信」的開關控制（各站自己的 data/fate_mail_settings.json，預設關閉）。
 *  只有在明確設定環境變數 FATE_MEMBER_MANUAL_APPROVAL 時，才由環境變數鎖定並覆寫後台設定。 */
if (!defined('FATE_MEMBER_MANUAL_APPROVAL')) {
    $maEnv = getenv('FATE_MEMBER_MANUAL_APPROVAL');
    if ($maEnv !== false && trim((string) $maEnv) !== '') {
        $ma = strtolower(trim((string) $maEnv));
        define('FATE_MEMBER_MANUAL_APPROVAL', in_array($ma, ['1', 'true', 'yes', 'on'], true));
    }
}
/** 信箱驗證：完整 schema 見 sql/install.sql（members 含 email／email_verified_at、fate_member_email_verify_tokens）。寄信環境：
 * — FATE_BREVO_API_KEY：Brevo Transactional SMTP API（非空優先）。
 * — FATE_MAIL_FROM、選填 FATE_MAIL_FROM_NAME；無 Brevo 依賴伺服器 mail()。
 * — FATE_PUBLIC_SITE_ORIGIN（如 https://example.com/path/fate）建議強制設定，否則自 $_SERVER 推導信內驗證連結。
 * — FATE_SITE_SHORT_NAME、FATE_EMAIL_RESEND_COOLDOWN_SEC（約 65 秒）選填。
 */

/** Session Cookie path（站台若不在網域根目錄，設為 /fate/ 等）；預設 / */
if (!defined('FATE_SESSION_COOKIE_PATH')) {
    $cp = trim((string) (getenv('FATE_SESSION_COOKIE_PATH') ?: '/'));
    define('FATE_SESSION_COOKIE_PATH', $cp !== '' ? $cp : '/');
}
/**
 * 登入 Session 有效秒數（Cookie 與伺服器 gc_maxlifetime）；預設 30 天。
 * 環境變數 FATE_SESSION_LIFETIME_SEC（3600～7776000，即 90 天上限）。
 */
if (!defined('FATE_SESSION_LIFETIME_SEC')) {
    $sl = (int) (getenv('FATE_SESSION_LIFETIME_SEC') ?: '2592000');
    define('FATE_SESSION_LIFETIME_SEC', max(3600, min(7776000, $sl)));
}
/**
 * 登入時未勾「保持登入」的較短有效期；預設 7 天。
 * 環境變數 FATE_SESSION_SHORT_LIFETIME_SEC。
 */
if (!defined('FATE_SESSION_SHORT_LIFETIME_SEC')) {
    $ss = (int) (getenv('FATE_SESSION_SHORT_LIFETIME_SEC') ?: '604800');
    define('FATE_SESSION_SHORT_LIFETIME_SEC', max(3600, min(FATE_SESSION_LIFETIME_SEC, $ss)));
}
/** 後台「分批同步」每個 HTTP 請求最多處理的店家筆數（含 API 往返）；環境變數 FATE_SYNC_BATCH_DETAIL */
if (!defined('FATE_SYNC_BATCH_DETAIL')) {
    define('FATE_SYNC_BATCH_DETAIL', max(1, min(80, (int) (getenv('FATE_SYNC_BATCH_DETAIL') ?: '6'))));
}
/** CLI 一次同步時每輪處理的店家數（避免單函式邏輯重複）；環境變數 FATE_SYNC_CLI_CHUNK_DETAIL */
if (!defined('FATE_SYNC_CLI_CHUNK_DETAIL')) {
    define('FATE_SYNC_CLI_CHUNK_DETAIL', max(1, min(5000, (int) (getenv('FATE_SYNC_CLI_CHUNK_DETAIL') ?: '250'))));
}
/** 圖片同步：每個 HTTP 請求最多下載張數；環境變數 FATE_SYNC_BATCH_IMAGES */
if (!defined('FATE_SYNC_BATCH_IMAGES')) {
    define('FATE_SYNC_BATCH_IMAGES', max(1, min(20, (int) (getenv('FATE_SYNC_BATCH_IMAGES') ?: '4'))));
}
/** 圖片同步建議最低可用磁碟（位元組）；僅用於後台提示，預設 6GB */
if (!defined('FATE_SYNC_IMAGE_MIN_FREE_BYTES')) {
    define('FATE_SYNC_IMAGE_MIN_FREE_BYTES', max(1073741824, (int) (getenv('FATE_SYNC_IMAGE_MIN_FREE_BYTES') ?: '6442450944')));
}
/** 同步時是否另寫入 payload_json 完整備份；環境變數 1／true／yes／on */
if (!defined('FATE_SYNC_ARCHIVE_JSON_PAYLOAD')) {
    $arch = strtolower(trim((string) (getenv('FATE_SYNC_ARCHIVE_JSON_PAYLOAD') ?: '')));
    define('FATE_SYNC_ARCHIVE_JSON_PAYLOAD', in_array($arch, ['1', 'true', 'yes', 'on'], true));
}
/** 訪客／統計相關環境變數（瀏覽紀錄見 fate_visit_log）；legacy pepper 已不再用於訪客鍵 */
if (!defined('FATE_VISITOR_HASH_PEPPER')) {
    define('FATE_VISITOR_HASH_PEPPER', (string) (getenv('FATE_VISITOR_HASH_PEPPER') ?: ''));
}
/** 是否信任反向代理傳入的 X-Forwarded-For（取第一個 IP）；環境變數 1／true／yes／on */
if (!defined('FATE_BEHIND_PROXY')) {
    $bp = strtolower(trim((string) (getenv('FATE_BEHIND_PROXY') ?: '')));
    define('FATE_BEHIND_PROXY', in_array($bp, ['1', 'true', 'yes', 'on'], true));
}
/**
 * legacy：`fate_visitor_pulse()` 已為空操作；間隔設定保留相容，不再影響寫入。
 * 環境變數 FATE_VISITOR_PULSE_INTERVAL_SEC。
 */
if (!defined('FATE_VISITOR_PULSE_INTERVAL_SEC')) {
    $vpIv = (int) (getenv('FATE_VISITOR_PULSE_INTERVAL_SEC') ?: '45');
    define('FATE_VISITOR_PULSE_INTERVAL_SEC', max(10, min(600, $vpIv)));
}
/**
 * PDO 連線後對 MySQL 套用讀／寫逾時（秒）；0 表示不設定。環境變數 FATE_DB_READ_TIMEOUT_SEC、FATE_DB_WRITE_TIMEOUT_SEC。
 */
if (!defined('FATE_DB_READ_TIMEOUT_SEC')) {
    define('FATE_DB_READ_TIMEOUT_SEC', max(0, min(120, (int) (getenv('FATE_DB_READ_TIMEOUT_SEC') ?: '10'))));
}
if (!defined('FATE_DB_WRITE_TIMEOUT_SEC')) {
    define('FATE_DB_WRITE_TIMEOUT_SEC', max(0, min(120, (int) (getenv('FATE_DB_WRITE_TIMEOUT_SEC') ?: '10'))));
}
