<?php

declare(strict_types=1);

/**
 * 店家頁「推薦技師」區塊（橫式列表）。
 * 依賴外層 store_main.php 既有變數：$pdo、$sid（店家 id）、$fatePublicMember。
 */

if (!isset($pdo) || !($pdo instanceof PDO)) {
    return;
}

require_once dirname(__DIR__, 3) . '/includes/fate_masseur_image.php';
require_once dirname(__DIR__, 3) . '/includes/fate_store_masseurs.php';
require_once dirname(__DIR__, 3) . '/includes/fate_masseur_tags.php';
require_once dirname(__DIR__, 3) . '/includes/fate_crowd_reports.php';
require_once dirname(__DIR__, 3) . '/includes/fate_plugins.php';
require_once dirname(__DIR__, 3) . '/includes/fate_member_tier.php';
require_once dirname(__DIR__, 3) . '/includes/fate_member_profile.php';
require_once dirname(__DIR__, 3) . '/includes/fate_masseur_favorites.php';
require_once dirname(__DIR__, 3) . '/includes/fate_masseur_profile_stats.php';
require_once dirname(__DIR__, 3) . '/includes/fate_public_member_auth.php';
require_once dirname(__DIR__, 3) . '/includes/fate_ncoin_settings.php';
$storeMasseurNcoinEsc = htmlspecialchars(fate_ncoin_display_name(), ENT_QUOTES, 'UTF-8');

$masseurStoreId = isset($sid) ? (int) $sid : (isset($storeId) ? (int) $storeId : 0);
if ($masseurStoreId <= 0) {
    return;
}

$masseurRewards = fate_masseur_rewards_settings();
if (!$masseurRewards['feature_enabled']) {
    return;
}
$masseurForumActive = fate_store_forum_plugin_active();
$masseurReviewsEnabled = $masseurForumActive ? false : fate_masseur_reviews_enabled();
$masseurReviewPaidCfg = [];
$masseurReviewPaidEnabled = false;
if ($masseurReviewsEnabled) {
    require_once dirname(__DIR__, 3) . '/includes/fate_rich_editor.php';
    require_once dirname(__DIR__, 3) . '/includes/fate_masseur_review_paid.php';
    require_once dirname(__DIR__, 3) . '/includes/fate_masseur_review_engagement.php';
    $masseurReviewPaidCfg = fate_masseur_review_paid_config();
    $masseurReviewPaidEnabled = !empty($masseurReviewPaidCfg['enabled']);
    fate_rich_editor_use();
    fate_rich_editor_head_assets();
}

$masseurViewer = $fatePublicMember ?? null;
$masseurMemberId = is_array($masseurViewer) ? (int) ($masseurViewer['id'] ?? 0) : 0;
$masseurLoggedIn = $masseurMemberId > 0;
$masseurCanInteract = $masseurLoggedIn && $pdo instanceof PDO && fate_public_member_can_interact($pdo);
$masseurVerified = $masseurCanInteract;
if ($masseurLoggedIn && $pdo instanceof PDO) {
    fate_public_member_ensure_admin_flag($pdo);
}
$masseurViewerIsAdmin = $masseurLoggedIn && fate_masseur_member_is_site_admin();
$masseurViewerIsStaff = $masseurLoggedIn && $pdo instanceof PDO && fate_masseur_member_is_site_staff($pdo);
$masseurBlacklisted = $masseurLoggedIn && $pdo instanceof PDO && fate_public_member_is_blacklisted($pdo);
$masseurCanViewReviews = $masseurReviewsEnabled;
$masseurEditPhotoInits = [];
$masseurCsrf = fate_public_member_csrf_token();
$masseurGenders = fate_masseur_gender_labels();
$masseurProfileStatsEnabled = fate_masseur_profile_stats_enabled();

/** 建檔表單：各性別預設頭像 URL（供 JS 切換預覽）。 */
$masseurDefaultAvatarUrls = [];
foreach (array_keys($masseurGenders) as $masseurGenderKey) {
    $masseurDefaultUrl = fate_masseur_default_avatar_public_url((string) $masseurGenderKey);
    if ($masseurDefaultUrl !== null) {
        $masseurDefaultAvatarUrls[$masseurGenderKey] = $masseurDefaultUrl;
    }
}
$masseurGenderSymbols = ['female' => '♀', 'male' => '♂', 'other' => '☻'];

$masseurFlashOk = isset($_SESSION['fate_masseur_flash_ok']) ? (string) $_SESSION['fate_masseur_flash_ok'] : '';
$masseurFlashBad = isset($_SESSION['fate_masseur_flash_bad']) ? (string) $_SESSION['fate_masseur_flash_bad'] : '';
unset($_SESSION['fate_masseur_flash_ok'], $_SESSION['fate_masseur_flash_bad']);

$masseurs = fate_masseur_list_for_store($pdo, $masseurStoreId, $masseurMemberId);
$masseurTagIds = array_map(static fn (array $m): int => (int) ($m['id'] ?? 0), $masseurs);
require_once dirname(__DIR__, 3) . '/includes/fate_masseur_weekly_recommend.php';
$masseurWeeklyEnabled = fate_masseur_weekly_recommend_enabled();
$masseurWeeklyUsage = ['used' => 0, 'max' => fate_masseur_weekly_recommend_max_per_week(), 'recommended_ids' => []];
$masseurWeeklyCounts = [];
if ($masseurWeeklyEnabled) {
    $masseurWeeklyWeek = fate_masseur_weekly_recommend_week_date();
    $masseurWeeklyCounts = fate_masseur_weekly_recommend_counts_map($pdo, $masseurTagIds, $masseurWeeklyWeek);
    if ($masseurMemberId > 0) {
        $masseurWeeklyUsage = fate_masseur_weekly_recommend_member_usage($pdo, $masseurMemberId, $masseurWeeklyWeek);
    }
}
$masseurViewerFavorites = fate_masseur_favorite_viewer_map($pdo, $masseurMemberId, $masseurTagIds);
$masseurTagPayload = fate_masseur_tag_store_payload($pdo, $masseurTagIds, $masseurMemberId);
$masseurCrowdPayload = fate_crowd_report_batch_payload($pdo, FATE_CROWD_ENTITY_MASSEUR, $masseurTagIds, $masseurMemberId);
$masseurCrowdCanInteract = $masseurCanInteract;
$masseurHasTags = ($masseurTagPayload['topics'] ?? []) !== [];
$masseurTagsFormalOnly = fate_masseur_tags_formal_only();
$masseurStatsFormalOnly = fate_masseur_profile_stats_formal_only();
$masseurCanAccessTagsFormal = !$masseurTagsFormalOnly
    || ($pdo instanceof PDO && fate_member_can_access_formal_only($pdo, $masseurMemberId, true));
$masseurCanViewTags = $masseurHasTags && $masseurCanAccessTagsFormal;
$masseurTagInteract = $masseurCanInteract && $masseurCanAccessTagsFormal;

$masseurPhotoUrl = static function (string $rel): ?string {
    $r = str_replace('\\', '/', trim($rel));
    if ($r === '' || str_contains($r, '..')) {
        return null;
    }

    return './' . ltrim($r, '/');
};

$loginNext = rawurlencode('store.php?id=' . $masseurStoreId);
$masseurInTab = !empty($masseurInTab);
$masseurReviewsPerPage = fate_masseur_reviews_per_page();
/** @var Closure(int,int):string */
$masseurBuildReviewPageUrl = static function (int $masseurId, int $page) use ($masseurStoreId): string {
    $q = $_GET;
    $q['id'] = (string) $masseurStoreId;
    $q['rpage_' . $masseurId] = (string) max(1, $page);

    return 'store.php?' . http_build_query($q) . '#masseur-' . $masseurId;
};
?>
<?php if ($masseurInTab): ?>
<div class="store-tab-panel__inner masseur-section<?= $masseurForumActive ? ' masseur-section--forum' : '' ?>" id="masseur-list">
    <div class="masseur-head masseur-head--tab">
        <span class="masseur-count"><?= count($masseurs) ?> 位技師</span>
    </div>
<?php else: ?>
<section class="store-card-fate store-card-fate--block masseur-section<?= $masseurForumActive ? ' masseur-section--forum' : '' ?>" id="masseur-list" aria-label="推薦技師">
    <div class="masseur-head">
        <h2 class="store-section-fate-h">推薦技師</h2>
        <span class="masseur-count"><?= count($masseurs) ?> 位</span>
    </div>
<?php endif; ?>

    <?php if ($masseurFlashOk !== ''): ?>
        <p class="masseur-flash masseur-flash--ok"><?= htmlspecialchars($masseurFlashOk, ENT_QUOTES, 'UTF-8') ?></p>
    <?php endif; ?>
    <?php if ($masseurFlashBad !== ''): ?>
        <p class="masseur-flash masseur-flash--bad"><?= htmlspecialchars($masseurFlashBad, ENT_QUOTES, 'UTF-8') ?></p>
    <?php endif; ?>

    <?php if ($masseurForumActive): ?>
        <p class="masseur-forum-hint">討論區已啟用：請點技師旁的「💬 討論」發表看法，此處不再顯示文字評論。</p>
    <?php endif; ?>

    <?php if ($masseurs === []): ?>
        <p class="masseur-empty">目前尚無推薦技師，歡迎完成驗證的會員率先推薦。</p>
    <?php endif; ?>

    <ul class="masseur-rows">
        <?php foreach ($masseurs as $m): ?>
            <?php
            $mid = (int) $m['id'];
            $mName = (string) ($m['name'] ?? '');
            $mGender = (string) ($m['gender'] ?? 'female');
            $mGenderLabel = $masseurGenders[$mGender] ?? '女';
            $mPhoto = fate_masseur_resolve_photo_public_url((string) ($m['photo_rel'] ?? ''), $mGender);
            $mHasPhoto = $mPhoto !== null;
            $mLikes = (int) ($m['like_count'] ?? 0);
            $mDislikes = (int) ($m['dislike_count'] ?? 0);
            $mFavCount = (int) ($m['favorite_count'] ?? 0);
            $mViewerFav = !empty($masseurViewerFavorites[$mid]);
            $mViewerVote = (int) ($m['viewer_vote'] ?? 0);
            $mCreatedDate = ($c = (string) ($m['created_at'] ?? '')) !== '' ? substr($c, 0, 10) : '';
            $mReviewCount = (int) ($m['review_count'] ?? 0);
            $mReviewPage = isset($_GET['rpage_' . $mid]) ? max(1, (int) $_GET['rpage_' . $mid]) : 1;
            $mReviewPages = $mReviewCount > 0
                ? max(1, (int) ceil($mReviewCount / $masseurReviewsPerPage))
                : 1;
            if ($mReviewPage > $mReviewPages) {
                $mReviewPage = $mReviewPages;
            }
            $mReviews = [];
            if ($masseurCanViewReviews && $masseurLoggedIn && $mReviewCount > 0) {
                $mReviews = fate_masseur_reviews_for(
                    $pdo,
                    $mid,
                    false,
                    $masseurReviewsPerPage,
                    ($mReviewPage - 1) * $masseurReviewsPerPage
                );
                if ($masseurReviewPaidEnabled) {
                    $mReviews = fate_masseur_review_paid_attach($pdo, $mReviews, $masseurMemberId, $masseurViewerIsAdmin);
                }
                $mReviews = fate_masseur_review_engagement_attach($pdo, $mReviews, $masseurMemberId);
            }
            $mReviewPagerOn = $mReviewCount > $masseurReviewsPerPage;
            $mCanEdit = $masseurVerified && fate_masseur_can_edit($m, $masseurMemberId, $masseurViewerIsAdmin);
            $mCanDelete = $masseurVerified && fate_masseur_can_delete($masseurViewerIsAdmin);
            $mHasCustomPhoto = trim((string) ($m['photo_rel'] ?? '')) !== '';
            $mEditOpen = isset($_GET['edit_' . $mid]);
            $mEpfx = 'masseur-edit-' . $mid;
            if ($mCanEdit) {
                $masseurEditPhotoInits[] = $mid;
            }
            ?>
            <li class="masseur-row<?= $masseurForumActive ? ' masseur-row--forum' : '' ?>" id="masseur-<?= $mid ?>">
                <div class="masseur-row__main">
                    <div class="masseur-avatar-wrap<?= $mHasPhoto ? ' masseur-avatar-wrap--has-photo' : '' ?>">
                        <div class="masseur-row__avatar masseur-row__avatar--<?= htmlspecialchars($mGender, ENT_QUOTES, 'UTF-8') ?>">
                            <?php if ($mHasPhoto): ?>
                                <img src="<?= htmlspecialchars($mPhoto, ENT_QUOTES, 'UTF-8') ?>" alt="<?= htmlspecialchars($mName, ENT_QUOTES, 'UTF-8') ?>" loading="lazy" decoding="async">
                            <?php else: ?>
                                <span aria-hidden="true"><?= $mGender === 'male' ? '♂' : ($mGender === 'female' ? '♀' : '☻') ?></span>
                            <?php endif; ?>
                        </div>
                        <?php if ($mHasPhoto): ?>
                            <div class="masseur-avatar-preview" role="tooltip" aria-hidden="true">
                                <img src="<?= htmlspecialchars($mPhoto, ENT_QUOTES, 'UTF-8') ?>" alt="" loading="lazy" decoding="async">
                            </div>
                        <?php endif; ?>
                    </div>
                    <div class="masseur-row__info">
                        <div class="masseur-row__namerow">
                            <span class="masseur-row__name"><?= htmlspecialchars($mName, ENT_QUOTES, 'UTF-8') ?></span>
                            <span class="masseur-card__gender"><?= htmlspecialchars($mGenderLabel, ENT_QUOTES, 'UTF-8') ?></span>
                            <?php if ($mCreatedDate !== ''): ?>
                                <span class="masseur-row__date">建檔 <?= htmlspecialchars($mCreatedDate, ENT_QUOTES, 'UTF-8') ?></span>
                            <?php endif; ?>
                            <?php
                            // 論壇插件（守衛式注入）：技師討論連結；移除 /forum 後自動消失。
                            $forumMasseurHookFile = dirname(__DIR__, 3) . '/forum/hook.php';
                            if (is_file($forumMasseurHookFile)) {
                                $forumHookMasseurId = $mid;
                                require $forumMasseurHookFile;
                            }
                            ?>
                        </div>
                        <?php if ($pdo instanceof PDO && fate_masseur_profile_stats_visible_to_viewer($pdo, $masseurMemberId, $m)): ?>
                            <?php
                            $masseur = $m;
                            $wrapperClass = 'masseur-profile-stats masseur-profile-stats--inline';
                            require dirname(__DIR__, 3) . '/includes/partials/masseur_profile_stats_display.inc.php';
                            ?>
                        <?php elseif ($masseurProfileStatsEnabled && fate_masseur_profile_stats_show_public($m) && $masseurStatsFormalOnly && $pdo instanceof PDO): ?>
                            <p class="masseur-formal-locked masseur-formal-locked--inline masseur-formal-locked--stats"><?= htmlspecialchars(fate_masseur_formal_only_view_message($pdo, $masseurMemberId, '更多技師情報'), ENT_QUOTES, 'UTF-8') ?></p>
                        <?php endif; ?>
                    </div>
                    <div class="masseur-row__actions">
                        <div class="masseur-row__fav">
                            <?php if ($masseurVerified): ?>
                                <form method="post" action="api/masseur_action.php" class="masseur-favorite-form">
                                    <input type="hidden" name="csrf" value="<?= htmlspecialchars($masseurCsrf, ENT_QUOTES, 'UTF-8') ?>">
                                    <input type="hidden" name="action" value="favorite">
                                    <input type="hidden" name="store_id" value="<?= $masseurStoreId ?>">
                                    <input type="hidden" name="masseur_id" value="<?= $mid ?>">
                                    <button type="submit" class="masseur-favorite-btn<?= $mViewerFav ? ' is-active' : '' ?>" title="<?= $mViewerFav ? '取消收藏' : '收藏技師' ?>">♥ <?= $mFavCount ?></button>
                                </form>
                            <?php else: ?>
                                <span class="masseur-favorite-btn is-static" title="收藏人數">♥ <?= $mFavCount ?></span>
                            <?php endif; ?>
                        </div>
                        <div class="masseur-row__votes">
                            <?php if ($masseurVerified): ?>
                                <form method="post" action="api/masseur_action.php" class="masseur-vote-form">
                                    <input type="hidden" name="csrf" value="<?= htmlspecialchars($masseurCsrf, ENT_QUOTES, 'UTF-8') ?>">
                                    <input type="hidden" name="action" value="vote">
                                    <input type="hidden" name="store_id" value="<?= $masseurStoreId ?>">
                                    <input type="hidden" name="masseur_id" value="<?= $mid ?>">
                                    <button type="submit" name="vote" value="up" class="masseur-vote-btn<?= $mViewerVote === 1 ? ' is-active' : '' ?>" title="讚">👍 <?= $mLikes ?></button>
                                    <button type="submit" name="vote" value="down" class="masseur-vote-btn<?= $mViewerVote === -1 ? ' is-active' : '' ?>" title="不讚">👎 <?= $mDislikes ?></button>
                                </form>
                            <?php else: ?>
                                <span class="masseur-vote-btn is-static" title="讚">👍 <?= $mLikes ?></span>
                                <span class="masseur-vote-btn is-static" title="不讚">👎 <?= $mDislikes ?></span>
                            <?php endif; ?>
                        </div>
                        <?php if ($masseurWeeklyEnabled): ?>
                            <?php
                            $mWeeklyCount = (int) ($masseurWeeklyCounts[$mid] ?? 0);
                            $mViewerWeekly = in_array($mid, $masseurWeeklyUsage['recommended_ids'], true);
                            $mWeeklyQuotaFull = !$mViewerWeekly && (int) $masseurWeeklyUsage['used'] >= (int) $masseurWeeklyUsage['max'];
                            ?>
                            <div class="masseur-row__weekly">
                                <?php if ($masseurVerified && !$masseurBlacklisted): ?>
                                    <?php if ($mViewerWeekly): ?>
                                        <span class="masseur-weekly-btn is-active is-static" title="本週已推薦">⭐ <?= $mWeeklyCount ?></span>
                                    <?php elseif ($mWeeklyQuotaFull): ?>
                                        <span class="masseur-weekly-btn is-static" title="本週推薦名額已用完">⭐ <?= $mWeeklyCount ?></span>
                                    <?php else: ?>
                                        <form method="post" action="api/masseur_action.php" class="masseur-weekly-form">
                                            <input type="hidden" name="csrf" value="<?= htmlspecialchars($masseurCsrf, ENT_QUOTES, 'UTF-8') ?>">
                                            <input type="hidden" name="action" value="weekly_recommend">
                                            <input type="hidden" name="store_id" value="<?= $masseurStoreId ?>">
                                            <input type="hidden" name="masseur_id" value="<?= $mid ?>">
                                            <button type="submit" class="masseur-weekly-btn" title="本週推薦（每週每技師 1 次）">⭐ <?= $mWeeklyCount ?></button>
                                        </form>
                                    <?php endif; ?>
                                <?php else: ?>
                                    <span class="masseur-weekly-btn is-static" title="本週推薦次數">⭐ <?= $mWeeklyCount ?></span>
                                <?php endif; ?>
                            </div>
                        <?php endif; ?>
                    </div>
                </div>

                <?php
                $masseurCrowdData = $masseurCrowdPayload[$mid] ?? [];
                fate_crowd_report_render_block(
                    FATE_CROWD_ENTITY_MASSEUR,
                    $mid,
                    $masseurCrowdData,
                    $masseurCrowdCanInteract,
                    $masseurCsrf,
                    array_keys(fate_crowd_report_masseur_keys()),
                    'api/crowd_report.php',
                    'store.php?id=' . $masseurStoreId,
                    'crowd-reports--masseur',
                    'masseur-' . $mid
                );
                ?>

                <?php if ($masseurCanViewTags): ?>
                <div class="masseur-card__tags">
                    <?php fate_masseur_tag_render_row($mid, $masseurStoreId, $masseurTagPayload, $masseurTagInteract, $masseurCsrf); ?>
                </div>
                <?php elseif ($masseurHasTags && $masseurTagsFormalOnly && $pdo instanceof PDO): ?>
                <p class="masseur-formal-locked masseur-formal-locked--tags"><?= htmlspecialchars(fate_masseur_formal_only_view_message($pdo, $masseurMemberId, '技師標籤'), ENT_QUOTES, 'UTF-8') ?></p>
                <?php endif; ?>

                <?php if ($masseurReviewsEnabled || $mCanEdit): ?>
                <div class="masseur-card__folds">
                <?php if ($masseurReviewsEnabled): ?>
                    <details class="masseur-reviews-fold"<?= isset($_GET['rpage_' . $mid]) ? ' open' : '' ?>>
                        <summary class="masseur-reviews-summary">評論 <span class="masseur-reviews-summary__n"><?= $mReviewCount ?></span> 則</summary>
                        <div class="masseur-reviews-body">
                            <?php if (!$masseurLoggedIn): ?>
                                <p class="masseur-formal-locked masseur-formal-locked--inline">
                                    <?php if ($mReviewCount > 0): ?>
                                        <a href="login.php?next=<?= $loginNext ?>" class="text-accent-link">登入</a>後可查看 <?= $mReviewCount ?> 則會員評論。
                                    <?php else: ?>
                                        <a href="login.php?next=<?= $loginNext ?>" class="text-accent-link">登入</a>後可查看與發表會員評論。
                                    <?php endif; ?>
                                </p>
                            <?php else: ?>
                                <?php if ($mReviews === []): ?>
                                    <p class="masseur-review-empty">尚無評論。</p>
                                <?php else: ?>
                                    <ul class="masseur-review-list">
                                        <?php foreach ($mReviews as $rv): ?>
                                            <?php
                                            $rvId = (int) ($rv['id'] ?? 0);
                                            $rvAvatar = fate_member_profile_avatar_url((string) ($rv['author_avatar'] ?? ''));
                                            $rvCanViewFull = !empty($rv['paid_viewer_full']);
                                            $rvIsPaid = !empty($rv['paid_active']);
                                            ?>
                                            <li class="masseur-review<?= $rvIsPaid ? ' masseur-review--paid' : '' ?>" id="masseur-review-<?= $mid ?>-paid-<?= $rvId ?>">
                                                <span class="masseur-review__avatar">
                                                    <?php if ($rvAvatar !== null): ?>
                                                        <img src="<?= htmlspecialchars($rvAvatar, ENT_QUOTES, 'UTF-8') ?>" alt="" loading="lazy" decoding="async">
                                                    <?php else: ?>
                                                        <span aria-hidden="true"><?= htmlspecialchars(mb_substr((string) ($rv['author_name'] ?? '會'), 0, 1), ENT_QUOTES, 'UTF-8') ?></span>
                                                    <?php endif; ?>
                                                </span>
                                                <div class="masseur-review__main">
                                                    <span class="masseur-review__author"><?= htmlspecialchars((string) ($rv['author_name'] ?? '會員'), ENT_QUOTES, 'UTF-8') ?></span>
                                                    <?php if ($rvIsPaid): ?>
                                                        <span class="masseur-review__paid-badge">付費</span>
                                                    <?php endif; ?>
                                                    <span class="masseur-review__date"><?= htmlspecialchars(substr((string) ($rv['created_at'] ?? ''), 0, 10), ENT_QUOTES, 'UTF-8') ?></span>
                                                    <div class="masseur-review__body"><?= fate_masseur_review_paid_render_body_html($rv, $rvCanViewFull) ?></div>
                                                    <?php if ($rvIsPaid && !$rvCanViewFull): ?>
                                                        <?php require __DIR__ . '/masseur_review_paid_buy.inc.php'; ?>
                                                    <?php endif; ?>
                                                    <?php require __DIR__ . '/masseur_review_engagement.inc.php'; ?>
                                                </div>
                                            </li>
                                        <?php endforeach; ?>
                                    </ul>
                                    <?php if ($mReviewPagerOn && $mReviewPages > 1): ?>
                                        <nav class="masseur-review-pager" aria-label="<?= htmlspecialchars($mName, ENT_QUOTES, 'UTF-8') ?> 評論分頁">
                                            <?php if ($mReviewPage > 1): ?>
                                                <a class="masseur-btn masseur-btn--sm" href="<?= htmlspecialchars($masseurBuildReviewPageUrl($mid, $mReviewPage - 1), ENT_QUOTES, 'UTF-8') ?>">上一頁</a>
                                            <?php endif; ?>
                                            <span class="masseur-review-pager__info">第 <?= $mReviewPage ?> / <?= $mReviewPages ?> 頁（共 <?= $mReviewCount ?> 則）</span>
                                            <?php if ($mReviewPage < $mReviewPages): ?>
                                                <a class="masseur-btn masseur-btn--sm" href="<?= htmlspecialchars($masseurBuildReviewPageUrl($mid, $mReviewPage + 1), ENT_QUOTES, 'UTF-8') ?>">下一頁</a>
                                            <?php endif; ?>
                                        </nav>
                                    <?php endif; ?>
                                <?php endif; ?>

                                <?php if ($masseurVerified || $masseurViewerIsStaff): ?>
                                    <form method="post" action="api/masseur_action.php" class="masseur-review-form">
                                        <input type="hidden" name="csrf" value="<?= htmlspecialchars($masseurCsrf, ENT_QUOTES, 'UTF-8') ?>">
                                        <input type="hidden" name="action" value="review">
                                        <input type="hidden" name="store_id" value="<?= $masseurStoreId ?>">
                                        <input type="hidden" name="masseur_id" value="<?= $mid ?>">
                                        <textarea name="body" rows="3" data-fate-rich-editor data-fate-rich-editor-height="180" placeholder="留下您的評論…" required></textarea>
                                        <?php if ($masseurReviewPaidEnabled): ?>
                                            <?php require __DIR__ . '/masseur_review_paid_fields.inc.php'; ?>
                                        <?php endif; ?>
                                        <button type="submit" class="masseur-btn masseur-btn--sm">送出評論</button>
                                    </form>
                                <?php else: ?>
                                    <p class="masseur-note masseur-note--sm">完成 <a href="member_profile.php" class="text-accent-link">Email 驗證</a> 後即可評論與評分。</p>
                                <?php endif; ?>
                            <?php endif; ?>
                        </div>
                    </details>
                <?php endif; ?>

                <?php if ($mCanEdit): ?>
                    <details class="masseur-edit-fold"<?= $mEditOpen ? ' open' : '' ?>>
                        <summary class="masseur-edit-summary">✎ 編輯技師<?= $masseurViewerIsAdmin ? '' : '（建檔者）' ?></summary>
                        <form method="post" action="api/masseur_action.php" class="masseur-edit-form">
                            <input type="hidden" name="csrf" value="<?= htmlspecialchars($masseurCsrf, ENT_QUOTES, 'UTF-8') ?>">
                            <input type="hidden" name="action" value="update">
                            <input type="hidden" name="store_id" value="<?= $masseurStoreId ?>">
                            <input type="hidden" name="masseur_id" value="<?= $mid ?>">
                            <input type="hidden" name="photo_data" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-data" value="">

                            <div class="masseur-field">
                                <label for="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-name">技師名稱</label>
                                <input type="text" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-name" name="name" maxlength="40" required value="<?= htmlspecialchars($mName, ENT_QUOTES, 'UTF-8') ?>">
                            </div>

                            <div class="masseur-field">
                                <label for="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-gender">性別</label>
                                <select id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-gender" name="gender">
                                    <?php foreach ($masseurGenders as $gk => $gl): ?>
                                        <option value="<?= htmlspecialchars($gk, ENT_QUOTES, 'UTF-8') ?>"<?= $gk === $mGender ? ' selected' : '' ?>><?= htmlspecialchars($gl, ENT_QUOTES, 'UTF-8') ?></option>
                                    <?php endforeach; ?>
                                </select>
                            </div>

                            <div class="masseur-field">
                                <label for="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-file">更換相片（選填，可剪裁並塗抹遮蔽五官）</label>
                                <?php if ($mHasPhoto): ?>
                                    <p class="masseur-hint">目前顯示：</p>
                                    <img src="<?= htmlspecialchars((string) $mPhoto, ENT_QUOTES, 'UTF-8') ?>" alt="" class="masseur-edit-current-photo" width="72" height="72">
                                <?php endif; ?>
                                <?php if ($mHasCustomPhoto): ?>
                                    <label class="masseur-hint masseur-edit-remove-photo">
                                        <input type="checkbox" name="remove_photo" value="1"> 移除自訂相片（改依性別使用預設頭像）
                                    </label>
                                <?php endif; ?>
                                <input type="file" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-file" accept="image/jpeg,image/png,image/webp">
                                <p class="masseur-hint" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-hint"><?= $mHasCustomPhoto ? '不上傳新圖則保留目前自訂相片。' : '未上傳則依性別使用站方預設頭像。' ?></p>
                                <div id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-default-photo" class="masseur-default-photo" aria-live="polite"<?= $mHasCustomPhoto ? ' hidden' : '' ?>>
                                    <span class="masseur-default-photo__label">預設頭像預覽</span>
                                    <div class="masseur-default-photo__box">
                                        <img id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-default-img" class="masseur-default-photo__img" alt="" hidden>
                                        <span id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-default-fallback" class="masseur-default-photo__symbol" aria-hidden="true"><?= htmlspecialchars($masseurGenderSymbols[$mGender] ?? '♀', ENT_QUOTES, 'UTF-8') ?></span>
                                    </div>
                                </div>
                                <div id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-panel" class="masseur-photo-editor" hidden>
                                    <div id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-crop-stage" class="masseur-photo-stage">
                                        <canvas id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-crop-canvas" class="masseur-photo-canvas masseur-photo-canvas--crop"></canvas>
                                        <div class="masseur-photo-tools">
                                            <label class="masseur-photo-brush-label">縮放
                                                <input type="range" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-crop-zoom" min="1" max="3" value="1" step="0.02">
                                            </label>
                                            <button type="button" class="masseur-btn masseur-btn--sm masseur-btn--primary" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-crop-apply">完成剪裁</button>
                                            <button type="button" class="masseur-btn masseur-btn--sm" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-cancel">取消</button>
                                        </div>
                                    </div>
                                    <div id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-edit-stage" class="masseur-photo-stage" hidden>
                                        <canvas id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-canvas" class="masseur-photo-canvas"></canvas>
                                        <div class="masseur-photo-tools">
                                            <label class="masseur-photo-brush-label">筆刷
                                                <input type="range" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-brush" min="10" max="120" value="40" step="2">
                                            </label>
                                            <button type="button" class="masseur-btn masseur-btn--sm" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-recrop">重新剪裁</button>
                                            <button type="button" class="masseur-btn masseur-btn--sm" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-reset">還原</button>
                                            <button type="button" class="masseur-btn masseur-btn--sm masseur-btn--primary" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-apply">套用相片</button>
                                            <button type="button" class="masseur-btn masseur-btn--sm" id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-cancel-edit">取消</button>
                                        </div>
                                    </div>
                                </div>
                                <div id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-preview-wrap" class="masseur-photo-preview-wrap" hidden>
                                    <span class="masseur-default-photo__label">上傳相片預覽</span>
                                    <img id="<?= htmlspecialchars($mEpfx, ENT_QUOTES, 'UTF-8') ?>-preview" class="masseur-photo-preview" alt="">
                                </div>
                            </div>

                            <?php if ($masseurProfileStatsEnabled): ?>
                                <?php
                                $mprefix = $mEpfx . '-';
                                $masseur = $m;
                                $fieldClass = 'masseur-field';
                                require dirname(__DIR__, 3) . '/includes/partials/masseur_profile_stats_form.inc.php';
                                ?>
                            <?php endif; ?>

                            <div class="masseur-create__actions">
                                <button type="submit" class="masseur-btn masseur-btn--primary">儲存變更</button>
                            </div>
                        </form>
                        <?php if ($mCanDelete): ?>
                            <form method="post" action="api/masseur_action.php" class="masseur-delete-form" onsubmit="return confirm('確定刪除此技師？相關評論、評分將一併刪除，已發放的 <?= $storeMasseurNcoinEsc ?>獎勵將依設定扣回。');">
                                <input type="hidden" name="csrf" value="<?= htmlspecialchars($masseurCsrf, ENT_QUOTES, 'UTF-8') ?>">
                                <input type="hidden" name="action" value="delete">
                                <input type="hidden" name="store_id" value="<?= $masseurStoreId ?>">
                                <input type="hidden" name="masseur_id" value="<?= $mid ?>">
                                <button type="submit" class="masseur-btn masseur-btn--sm masseur-btn--danger">刪除技師（管理員）</button>
                            </form>
                        <?php endif; ?>
                    </details>
                <?php endif; ?>
                </div>
                <?php endif; ?>
            </li>
        <?php endforeach; ?>
    </ul>

    <div class="masseur-create" id="masseur-new">
        <?php if (!$masseurCanInteract): ?>
            <p class="masseur-note">
                <?php if (!$masseurLoggedIn): ?>
                    請先<a href="login.php?next=<?= $loginNext ?>" class="text-accent-link">登入</a>並完成 Email 驗證後即可推薦技師<?= $masseurReviewsEnabled ? '與發表評論' : ($masseurForumActive ? '並參與討論' : '') ?>。
                <?php elseif ($masseurBlacklisted): ?>
                    您的帳號已被列入黑名單，無法參與互動。
                <?php else: ?>
                    請先完成 <a href="member_profile.php" class="text-accent-link">Email 驗證</a>，即可推薦技師<?= $masseurReviewsEnabled ? '、評論' : ($masseurForumActive ? '並參與討論' : '') ?>與評分。
                <?php endif; ?>
            </p>
        <?php else: ?>
            <details class="masseur-create-fold">
                <summary class="masseur-create-summary">＋ 新增推薦技師</summary>
                <form method="post" action="api/masseur_action.php" class="masseur-create-form" enctype="multipart/form-data">
                    <input type="hidden" name="csrf" value="<?= htmlspecialchars($masseurCsrf, ENT_QUOTES, 'UTF-8') ?>">
                    <input type="hidden" name="action" value="create">
                    <input type="hidden" name="store_id" value="<?= $masseurStoreId ?>">
                    <input type="hidden" name="photo_data" id="masseur_photo_data" value="">

                    <div class="masseur-field">
                        <label for="masseur-name">技師名稱</label>
                        <input type="text" id="masseur-name" name="name" maxlength="40" required placeholder="同一家店不可重複">
                    </div>

                    <div class="masseur-field">
                        <label for="masseur-gender">性別</label>
                        <select id="masseur-gender" name="gender">
                            <?php foreach ($masseurGenders as $gk => $gl): ?>
                                <option value="<?= htmlspecialchars($gk, ENT_QUOTES, 'UTF-8') ?>"<?= $gk === 'female' ? ' selected' : '' ?>><?= htmlspecialchars($gl, ENT_QUOTES, 'UTF-8') ?></option>
                            <?php endforeach; ?>
                        </select>
                    </div>

                    <?php if ($masseurProfileStatsEnabled): ?>
                        <?php
                        $mprefix = '';
                        $masseur = [];
                        $fieldClass = 'masseur-field';
                        require dirname(__DIR__, 3) . '/includes/partials/masseur_profile_stats_form.inc.php';
                        ?>
                    <?php endif; ?>

                    <div class="masseur-field">
                        <label for="masseur-photo">技師相片（選填，可剪裁並塗抹遮蔽五官）</label>
                        <input type="file" id="masseur-photo" accept="image/jpeg,image/png,image/webp">
                        <p class="masseur-hint" id="masseur-photo-hint">未上傳則依性別使用站方預設頭像。</p>
                        <div id="masseur-default-photo" class="masseur-default-photo" aria-live="polite">
                            <span class="masseur-default-photo__label">預設頭像預覽</span>
                            <div class="masseur-default-photo__box">
                                <img id="masseur-default-photo-img" class="masseur-default-photo__img" alt="" hidden>
                                <span id="masseur-default-photo-fallback" class="masseur-default-photo__symbol" aria-hidden="true"><?= htmlspecialchars($masseurGenderSymbols['female'] ?? '♀', ENT_QUOTES, 'UTF-8') ?></span>
                            </div>
                        </div>
                    </div>

                    <div class="masseur-photo-editor" id="masseur-photo-panel" hidden>
                        <div id="masseur-photo-crop-stage" class="masseur-photo-stage">
                            <canvas id="masseur-photo-crop-canvas" class="masseur-photo-canvas masseur-photo-canvas--crop"></canvas>
                            <div class="masseur-photo-tools">
                                <label class="masseur-photo-brush-label">縮放
                                    <input type="range" id="masseur-photo-crop-zoom" min="1" max="3" value="1" step="0.02">
                                </label>
                                <button type="button" class="masseur-btn masseur-btn--sm masseur-btn--primary" id="masseur-photo-crop-apply">完成剪裁</button>
                                <button type="button" class="masseur-btn masseur-btn--sm" id="masseur-photo-cancel">取消</button>
                            </div>
                        </div>
                        <div id="masseur-photo-edit-stage" class="masseur-photo-stage" hidden>
                            <canvas id="masseur-photo-canvas" class="masseur-photo-canvas"></canvas>
                            <div class="masseur-photo-tools">
                                <label class="masseur-photo-brush-label">筆刷
                                    <input type="range" id="masseur-photo-brush" min="10" max="120" value="40" step="2">
                                </label>
                                <button type="button" class="masseur-btn masseur-btn--sm" id="masseur-photo-recrop">重新剪裁</button>
                                <button type="button" class="masseur-btn masseur-btn--sm" id="masseur-photo-reset">還原</button>
                                <button type="button" class="masseur-btn masseur-btn--sm masseur-btn--primary" id="masseur-photo-apply">套用相片</button>
                                <button type="button" class="masseur-btn masseur-btn--sm" id="masseur-photo-cancel-edit">取消</button>
                            </div>
                        </div>
                    </div>
                    <div id="masseur-photo-preview-wrap" class="masseur-photo-preview-wrap" hidden>
                        <span class="masseur-default-photo__label">上傳相片預覽</span>
                        <img id="masseur-photo-preview" class="masseur-photo-preview" alt="">
                    </div>

                    <div class="masseur-create__actions">
                        <button type="submit" class="masseur-btn masseur-btn--primary">送出建檔</button>
                        <span class="masseur-reward-note">建檔 +<?= (int) $masseurRewards['reward_create'] ?><?= $masseurReviewsEnabled ? '、評論 +' . (int) $masseurRewards['reward_review'] : '' ?><?= (int) ($masseurRewards['reward_tag'] ?? 0) > 0 ? '、標籤 +' . (int) $masseurRewards['reward_tag'] : '' ?>、點讚 +<?= (int) $masseurRewards['reward_like'] ?> <?= $storeMasseurNcoinEsc ?></span>
                    </div>
                </form>
            </details>
        <?php endif; ?>
    </div>
<?php if ($masseurVerified || $masseurEditPhotoInits !== []): ?>
            <script src="./static/fate-masseur-photo.js?v=6" defer></script>
<?php endif; ?>
<?php if ($masseurProfileStatsEnabled && $masseurVerified): ?>
            <script src="./static/fate-masseur-profile-stats.js?v=1" defer></script>
<?php endif; ?>
<?php if ($masseurVerified || $masseurEditPhotoInits !== []): ?>
            <script>
            document.addEventListener('DOMContentLoaded', function () {
                var defaults = <?= json_encode($masseurDefaultAvatarUrls, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?>;
                var symbols = <?= json_encode($masseurGenderSymbols, JSON_UNESCAPED_UNICODE) ?>;
                <?php if ($masseurVerified): ?>
                if (typeof fateInitMasseurGenderDefaultPreview === 'function') {
                    fateInitMasseurGenderDefaultPreview({
                        genderId: 'masseur-gender',
                        wrapId: 'masseur-default-photo',
                        defaultImgId: 'masseur-default-photo-img',
                        defaultFallbackId: 'masseur-default-photo-fallback',
                        customPreviewId: 'masseur-photo-preview',
                        customPreviewWrapId: 'masseur-photo-preview-wrap',
                        hiddenId: 'masseur_photo_data',
                        fileId: 'masseur-photo',
                        panelId: 'masseur-photo-panel',
                        hintId: 'masseur-photo-hint',
                        defaults: defaults,
                        symbols: symbols
                    });
                }
                <?php endif; ?>
                <?php foreach ($masseurEditPhotoInits as $editMid): ?>
                <?php $editPfx = 'masseur-edit-' . (int) $editMid; ?>
                if (typeof fateInitMasseurPhotoEditor === 'function') {
                    fateInitMasseurPhotoEditor({
                        fileId: '<?= $editPfx ?>-file',
                        panelId: '<?= $editPfx ?>-panel',
                        cropStageId: '<?= $editPfx ?>-crop-stage',
                        editStageId: '<?= $editPfx ?>-edit-stage',
                        cropCanvasId: '<?= $editPfx ?>-crop-canvas',
                        cropZoomId: '<?= $editPfx ?>-crop-zoom',
                        cropApplyId: '<?= $editPfx ?>-crop-apply',
                        canvasId: '<?= $editPfx ?>-canvas',
                        hiddenId: '<?= $editPfx ?>-data',
                        brushId: '<?= $editPfx ?>-brush',
                        recropId: '<?= $editPfx ?>-recrop',
                        applyId: '<?= $editPfx ?>-apply',
                        resetId: '<?= $editPfx ?>-reset',
                        cancelId: '<?= $editPfx ?>-cancel',
                        cancelEditId: '<?= $editPfx ?>-cancel-edit',
                        previewId: '<?= $editPfx ?>-preview',
                        previewWrapId: '<?= $editPfx ?>-preview-wrap',
                        hintId: '<?= $editPfx ?>-hint',
                        cropAspect: 'portrait',
                        applyMessage: '新相片已套用，請按「儲存變更」。'
                    });
                }
                if (typeof fateInitMasseurGenderDefaultPreview === 'function') {
                    fateInitMasseurGenderDefaultPreview({
                        genderId: '<?= $editPfx ?>-gender',
                        wrapId: '<?= $editPfx ?>-default-photo',
                        defaultImgId: '<?= $editPfx ?>-default-img',
                        defaultFallbackId: '<?= $editPfx ?>-default-fallback',
                        customPreviewId: '<?= $editPfx ?>-preview',
                        customPreviewWrapId: '<?= $editPfx ?>-preview-wrap',
                        hiddenId: '<?= $editPfx ?>-data',
                        fileId: '<?= $editPfx ?>-file',
                        panelId: '<?= $editPfx ?>-panel',
                        hintId: '<?= $editPfx ?>-hint',
                        defaults: defaults,
                        symbols: symbols
                    });
                }
                <?php endforeach; ?>
            });
            </script>
<?php endif; ?>
<?php if ($masseurReviewsEnabled): ?>
    <?php fate_rich_editor_foot_assets('api/masseur_review_upload.php', $masseurCsrf); ?>
<?php endif; ?>
<?= $masseurInTab ? '</div>' : '</section>' ?>
