<?php

declare(strict_types=1);

/**
 * 店家刊登型態（共用 spa_store_snapshots；型態存於 payload_json.listing_kind）。
 *
 * fixed  — 定點店家（固定店面／可公開地址，含 API 同步與會員推薦）
 * mobile — 非定點服務（無固定店面、不公開路名；服務區域為縣市＋地區）
 */

const FATE_STORE_LISTING_FIXED = 'fixed';
const FATE_STORE_LISTING_MOBILE = 'mobile';

/** 首頁本週熱門輪播筆數（定點／非定點各自獨立排行）。 */
const FATE_WEEKLY_TOP_LIMIT = 10;

/** 首頁 TAB／前台顯示用標籤。 */
function fate_store_listing_tab_label(string $kind): string
{
    return fate_store_listing_normalize_kind($kind) === FATE_STORE_LISTING_MOBILE
        ? '非定點服務'
        : '定點店家';
}

/** 卡片／詳情頁徽章；定點回傳空字串（預設不顯示徽章）。 */
function fate_store_listing_label(string $kind): string
{
    return fate_store_listing_normalize_kind($kind) === FATE_STORE_LISTING_MOBILE
        ? '非定點服務'
        : '';
}

/** @return array<string,string> */
function fate_store_listing_labels(): array
{
    return [
        FATE_STORE_LISTING_FIXED => fate_store_listing_tab_label(FATE_STORE_LISTING_FIXED),
        FATE_STORE_LISTING_MOBILE => fate_store_listing_tab_label(FATE_STORE_LISTING_MOBILE),
    ];
}

function fate_store_listing_normalize_kind(?string $raw): string
{
    $k = strtolower(trim((string) $raw));

    return $k === FATE_STORE_LISTING_MOBILE ? FATE_STORE_LISTING_MOBILE : FATE_STORE_LISTING_FIXED;
}

/** 首頁 TAB 查詢參數 listing=fixed|mobile */
function fate_store_listing_normalize_tab(?string $raw): string
{
    return fate_store_listing_normalize_kind($raw);
}

/** WHERE 子句（不含 AND 前綴）。 */
function fate_store_listing_sql_condition(string $kind): string
{
    if (fate_store_listing_normalize_kind($kind) === FATE_STORE_LISTING_MOBILE) {
        return "payload_json LIKE '%\"listing_kind\":\"mobile\"%'";
    }

    return "(payload_json IS NULL OR TRIM(payload_json) = '' OR payload_json NOT LIKE '%\"listing_kind\":\"mobile\"%')";
}

/** 帶資料表別名的 listing 條件（供 JOIN 使用）。 */
function fate_store_listing_sql_condition_aliased(string $kind, string $tableAlias = 'snap'): string
{
    $cond = fate_store_listing_sql_condition($kind);

    return str_replace('payload_json', $tableAlias . '.payload_json', $cond);
}

/** @return array<string,mixed> */
function fate_store_listing_parse_payload(?string $json): array
{
    if ($json === null || trim($json) === '') {
        return [];
    }
    $j = json_decode($json, true);

    return is_array($j) ? $j : [];
}

/** @param array<string,mixed> $row */
function fate_store_listing_kind_from_row(array $row): string
{
    $payload = fate_store_listing_parse_payload(isset($row['payload_json']) ? (string) $row['payload_json'] : null);
    if (isset($payload['listing_kind'])) {
        return fate_store_listing_normalize_kind((string) $payload['listing_kind']);
    }

    return FATE_STORE_LISTING_FIXED;
}

function fate_store_listing_is_mobile(?array $row): bool
{
    return is_array($row) && fate_store_listing_kind_from_row($row) === FATE_STORE_LISTING_MOBILE;
}

/**
 * @param array<string,mixed> $extra
 */
function fate_store_listing_build_payload(string $kind, array $extra = []): string
{
    $payload = array_merge(['listing_kind' => fate_store_listing_normalize_kind($kind)], $extra);
    $json = json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

    return is_string($json) ? $json : '{"listing_kind":"fixed"}';
}

/** 到點服務：由縣市＋地區組成服務區域文字。 */
function fate_store_listing_format_service_area(string $city, string $district): string
{
    return trim($city . $district);
}

/** @param array<string,mixed> $row */
function fate_store_listing_service_area_from_row(array $row): string
{
    $payload = fate_store_listing_parse_payload(isset($row['payload_json']) ? (string) $row['payload_json'] : null);
    $fromPayload = trim((string) ($payload['service_area'] ?? ''));
    if ($fromPayload !== '') {
        return $fromPayload;
    }
    $city = trim((string) ($row['city_name'] ?? ''));
    $district = trim((string) ($row['district_name'] ?? ''));
    if ($city !== '' && $district !== '') {
        return fate_store_listing_format_service_area($city, $district);
    }

    $display = trim((string) ($row['display_address'] ?? ''));
    if (str_starts_with($display, '服務區域：')) {
        return trim(substr($display, strlen('服務區域：')));
    }

    return $display;
}

/** 列表／摘要用位置文字。 */
function fate_store_listing_location_text(array $row): string
{
    if (fate_store_listing_is_mobile($row)) {
        $area = fate_store_listing_service_area_from_row($row);
        if ($area === '') {
            return '非定點服務';
        }
        if (str_starts_with($area, '服務區域：')) {
            return $area;
        }

        return '服務區域：' . $area;
    }

    require_once __DIR__ . DIRECTORY_SEPARATOR . 'fate_member_stores.php';

    return fate_member_store_format_address($row);
}

/** @param array{phone?:string,mobile?:string,line?:string,wechat?:string} $fields */
function fate_store_listing_has_contact(array $fields): bool
{
    foreach (['phone', 'mobile', 'line', 'wechat'] as $k) {
        if (trim((string) ($fields[$k] ?? '')) !== '') {
            return true;
        }
    }

    return false;
}
