<?php

declare(strict_types=1);

/**
 * 推薦技師前台動作端點：建檔／投票／評論。
 * POST action = create | vote | review | buy_paid_review | review_like | review_favorite；完成後 303 導回店家頁並以 Session flash 顯示結果。
 */

require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'app.php';
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_public_session.php';
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_public_member_auth.php';
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_store_masseurs.php';
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_masseur_profile_stats.php';

fate_public_session_start();

/** 論壇回跳：forum/thread.php 或 member_profile.php?tab=… */
function fate_masseur_sanitize_return_to(?string $raw): ?string
{
    $raw = trim((string) $raw);
    if ($raw === '' || str_contains($raw, '..') || preg_match('#^https?://#i', $raw) === 1) {
        return null;
    }
    if (preg_match('#^forum/thread\.php\?id=\d+$#', $raw) === 1) {
        return $raw;
    }
    if (preg_match('#^member_profile\.php\?tab=[a-z_]+$#', $raw) === 1) {
        return $raw;
    }
    if (preg_match('#^masseur_weekly\.php(\?[a-z0-9_=&%-]*)?$#i', $raw) === 1) {
        return $raw;
    }

    return null;
}

function fate_masseur_back_anchor(?string $returnTo, int $masseurId, string $defaultPrefix = 'masseur'): string
{
    if ($returnTo === 'member_profile.php?tab=favorites') {
        return 'fav-' . $masseurId;
    }
    if ($returnTo !== null && preg_match('#^forum/#', $returnTo) === 1) {
        return $defaultPrefix . '-' . $masseurId;
    }

    return 'masseur-' . $masseurId;
}

function fate_masseur_back(int $storeId, string $okMsg = '', string $badMsg = '', string $anchor = 'masseur-list'): void
{
    if ($okMsg !== '') {
        $_SESSION['fate_masseur_flash_ok'] = $okMsg;
    }
    if ($badMsg !== '') {
        $_SESSION['fate_masseur_flash_bad'] = $badMsg;
    }
    $returnTo = isset($_POST['return_to']) && is_string($_POST['return_to'])
        ? fate_masseur_sanitize_return_to($_POST['return_to'])
        : null;
    if ($returnTo !== null) {
        $target = '../' . $returnTo;
        if ($anchor !== '') {
            $target .= '#' . $anchor;
        }
    } else {
        $target = $storeId > 0 ? ('../store.php?id=' . $storeId . '#' . $anchor) : '../';
    }
    header('Location: ' . $target, true, 303);
    exit;
}

$storeId = isset($_POST['store_id']) ? (int) $_POST['store_id'] : 0;
$action = isset($_POST['action']) && is_string($_POST['action']) ? $_POST['action'] : '';

if ($_SERVER['REQUEST_METHOD'] !== 'POST' || $action === '') {
    fate_masseur_back($storeId, '', '無效的請求。');
}

$member = fate_public_member_current();
if ($member === null) {
    header('Location: ../login.php?next=' . rawurlencode('store.php?id=' . max(0, $storeId)), true, 302);
    exit;
}

$tok = isset($_POST['csrf']) && is_string($_POST['csrf']) ? $_POST['csrf'] : '';
if (!fate_public_member_csrf_check($tok)) {
    fate_masseur_back($storeId, '', '工作階段逾期，請重新整理後再試。');
}

$pdo = null;
try {
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'pdo.php';
    if (isset($GLOBALS['pdo']) && $GLOBALS['pdo'] instanceof PDO) {
        $pdo = $GLOBALS['pdo'];
    }
} catch (Throwable) {
    $pdo = null;
}
if (!$pdo instanceof PDO) {
    fate_masseur_back($storeId, '', '資料庫連線失敗，請稍後再試。');
}

fate_public_member_ensure_admin_flag($pdo);

if (!fate_public_member_can_interact($pdo)) {
    fate_masseur_back($storeId, '', fate_public_member_interact_denied_message($pdo));
}

$memberId = (int) $member['id'];
$username = (string) ($member['username'] ?? '');

if ($action === 'create') {
    $name = isset($_POST['name']) && is_string($_POST['name']) ? $_POST['name'] : '';
    $gender = isset($_POST['gender']) && is_string($_POST['gender']) ? $_POST['gender'] : 'female';
    $photo = isset($_POST['photo_data']) && is_string($_POST['photo_data']) ? $_POST['photo_data'] : '';
    $profileStats = fate_masseur_profile_stats_enabled() ? fate_masseur_profile_stats_parse_post($_POST) : null;
    $r = fate_masseur_create($pdo, $storeId, $memberId, $name, $gender, $photo, $profileStats);
    if ($r['ok']) {
        $anchor = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null) !== null
            ? 'forum-store-masseurs'
            : ('masseur-' . (int) $r['id']);
        fate_masseur_back($storeId, '已完成技師建檔，感謝您的推薦！', '', $anchor);
    }
    $failAnchor = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null) !== null
        ? 'forum-masseur-new'
        : 'masseur-new';
    fate_masseur_back($storeId, '', $r['error'] ?? '建檔失敗。', $failAnchor);
}

if ($action === 'update') {
    $masseurId = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
    $masseur = fate_masseur_get($pdo, $masseurId);
    if ($masseur === null) {
        fate_masseur_back($storeId, '', '找不到技師。');
    }
    if ((int) ($masseur['spa_store_id'] ?? 0) !== $storeId) {
        fate_masseur_back($storeId, '', '店家不符，無法編輯。');
    }
    $isAdmin = fate_masseur_member_is_site_admin();
    if (!fate_masseur_can_edit($masseur, $memberId, $isAdmin)) {
        fate_masseur_back($storeId, '', '您沒有權限編輯此技師。', 'masseur-' . $masseurId);
    }
    $name = isset($_POST['name']) && is_string($_POST['name']) ? $_POST['name'] : '';
    $gender = isset($_POST['gender']) && is_string($_POST['gender']) ? $_POST['gender'] : 'female';
    $photo = isset($_POST['photo_data']) && is_string($_POST['photo_data']) ? $_POST['photo_data'] : '';
    $removePhoto = !empty($_POST['remove_photo']);
    $profileStats = fate_masseur_profile_stats_enabled() ? fate_masseur_profile_stats_parse_post($_POST) : null;
    $r = fate_masseur_update($pdo, $masseurId, $name, $gender, $photo, $removePhoto, $profileStats);
    if ($r['ok']) {
        fate_masseur_back($storeId, '已更新技師資料。', '', 'masseur-' . $masseurId);
    }
    fate_masseur_back($storeId, '', $r['error'] ?? '更新失敗。', 'masseur-' . $masseurId);
}

if ($action === 'delete') {
    if (!fate_masseur_member_is_site_admin()) {
        fate_masseur_back($storeId, '', '僅管理員可刪除技師。');
    }
    $masseurId = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
    $masseur = fate_masseur_get($pdo, $masseurId);
    if ($masseur === null) {
        fate_masseur_back($storeId, '', '找不到技師。');
    }
    if ((int) ($masseur['spa_store_id'] ?? 0) !== $storeId) {
        fate_masseur_back($storeId, '', '店家不符，無法刪除。');
    }
    $r = fate_masseur_admin_delete($pdo, $masseurId);
    if ($r['ok']) {
        fate_masseur_back($storeId, '已刪除技師（相關獎勵已依設定扣回）。', '', 'masseur-list');
    }
    fate_masseur_back($storeId, '', $r['error'] ?? '刪除失敗。', 'masseur-' . $masseurId);
}

if ($action === 'vote') {
    $masseurId = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
    $vote = isset($_POST['vote']) && (string) $_POST['vote'] === 'down' ? -1 : 1;
    $r = fate_masseur_vote($pdo, $masseurId, $memberId, $vote, $username);
    $forumReturn = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null);
    $voteAnchor = $forumReturn !== null
        ? ('forum-masseur-votes-' . $masseurId)
        : ('masseur-' . $masseurId);
    if ($r['ok']) {
        $label = $r['state'] === 1 ? '已按讚' : ($r['state'] === -1 ? '已標記不讚' : '已取消評分');
        fate_masseur_back($storeId, $label, '', $voteAnchor);
    }
    fate_masseur_back($storeId, '', $r['error'] ?? '投票失敗。', $voteAnchor);
}

if ($action === 'tag_pick') {
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_masseur_rewards.php';
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_member_tier.php';
    if (!fate_member_can_access_formal_only($pdo, $memberId, fate_masseur_tags_formal_only())) {
        $returnTo = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null);
        $masseurIdForAnchor = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
        $anchor = $returnTo === 'member_profile.php?tab=favorites'
            ? ('fav-' . $masseurIdForAnchor)
            : ($returnTo !== null ? ('masseur-tags-' . $masseurIdForAnchor) : ('masseur-' . $masseurIdForAnchor));
        fate_masseur_back($storeId, '', fate_masseur_formal_only_view_message($pdo, $memberId, '技師標籤'), $anchor);
    }
    $masseurId = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
    $tagId = isset($_POST['tag_id']) ? (int) $_POST['tag_id'] : 0;
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_masseur_tags.php';
    $r = fate_masseur_tag_pick_toggle($pdo, $masseurId, $tagId, $memberId, $username);
    $returnTo = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null);
    $anchor = $returnTo === 'member_profile.php?tab=favorites'
        ? ('fav-' . $masseurId)
        : ($returnTo !== null
            ? ('masseur-tags-' . $masseurId)
            : ('masseur-' . $masseurId));
    if ($r['ok']) {
        $label = $r['picked'] ? '已選擇標籤。' : '已取消標籤。';
        if ($r['picked'] && !empty($r['reward_skipped_cap'])) {
            $label = '已選擇標籤（標籤獎勵已達上限，仍可繼續點選但不發幣）。';
        }
        fate_masseur_back($storeId, $label, '', $anchor);
    }
    fate_masseur_back($storeId, '', $r['error'] ?? '標籤操作失敗。', $anchor);
}

if ($action === 'review') {
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_plugins.php';
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_masseur_rewards.php';
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_member_tier.php';
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_rich_body.php';
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_masseur_review_paid.php';
    if (fate_store_forum_plugin_active()) {
        fate_masseur_back($storeId, '', '討論區已啟用，請使用技師旁的「討論」發表看法。', 'masseur-list');
    }
    $masseurId = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
    $bodyRaw = isset($_POST['body']) && is_string($_POST['body']) ? $_POST['body'] : '';
    $body = fate_rich_body_prepare_for_storage($bodyRaw);
    $bodyLen = fate_rich_body_text_length($body);
    $paidOpts = fate_masseur_review_paid_options_from_post($_POST, $bodyLen);
    if (!$paidOpts['ok']) {
        $returnTo = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null);
        fate_masseur_back($storeId, '', (string) ($paidOpts['error'] ?? '付費設定錯誤。'), fate_masseur_back_anchor($returnTo, $masseurId));
    }
    $returnTo = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null);
    $reviewAnchor = fate_masseur_back_anchor($returnTo, $masseurId);
    $r = fate_masseur_review_create($pdo, $masseurId, $memberId, $body, $username, [
        'is_paid' => !empty($paidOpts['is_paid']),
        'price' => (int) ($paidOpts['price'] ?? 0),
        'preview_chars' => (int) ($paidOpts['preview_chars'] ?? 0),
    ]);
    if ($r['ok']) {
        fate_masseur_back($storeId, '評論已送出，感謝您的分享！', '', $reviewAnchor);
    }
    fate_masseur_back($storeId, '', $r['error'] ?? '評論失敗。', $reviewAnchor);
}

if ($action === 'buy_paid_review') {
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_masseur_review_paid.php';
    $reviewId = isset($_POST['review_id']) ? (int) $_POST['review_id'] : 0;
    $masseurId = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
    $returnTo = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null);
    $reviewAnchor = 'masseur-review-' . $masseurId . '-paid-' . $reviewId;
    $buyRes = fate_masseur_review_paid_purchase($pdo, $reviewId, $memberId, $username, true);
    if ($buyRes['ok']) {
        fate_masseur_review_paid_flash_set('ok', '購買成功，已解鎖完整評論內容。', $reviewId);
        fate_masseur_back($storeId, '', '', $reviewAnchor);
    }
    fate_masseur_review_paid_flash_set('bad', (string) ($buyRes['error'] ?? '購買失敗。'), $reviewId);
    fate_masseur_back($storeId, '', '', $reviewAnchor);
}

if ($action === 'review_like') {
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_masseur_review_engagement.php';
    $reviewId = isset($_POST['review_id']) ? (int) $_POST['review_id'] : 0;
    $masseurId = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
    $returnTo = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null);
    $anchor = 'masseur-review-' . $masseurId . '-paid-' . $reviewId;
    $r = fate_masseur_review_like_toggle($pdo, $reviewId, $memberId);
    if ($r['ok']) {
        fate_masseur_back($storeId, '', '', $anchor);
    }
    fate_masseur_back($storeId, '', $r['error'] ?? '按讚失敗。', $anchor);
}

if ($action === 'review_favorite') {
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_masseur_review_engagement.php';
    $reviewId = isset($_POST['review_id']) ? (int) $_POST['review_id'] : 0;
    $masseurId = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
    $returnTo = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null);
    $anchor = 'masseur-review-' . $masseurId . '-paid-' . $reviewId;
    $r = fate_masseur_review_favorite_toggle($pdo, $memberId, $reviewId);
    if ($r['ok']) {
        $label = $r['favorited'] ? '已加入收藏。' : '已取消收藏。';
        fate_masseur_back($storeId, $label, '', $anchor);
    }
    fate_masseur_back($storeId, '', $r['error'] ?? '收藏操作失敗。', $anchor);
}

if ($action === 'weekly_recommend') {
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_masseur_weekly_recommend.php';
    $masseurId = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
    $r = fate_masseur_weekly_recommend($pdo, $masseurId, $memberId, $username);
    $returnTo = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null);
    $anchor = $returnTo !== null && str_starts_with($returnTo, 'masseur_weekly.php')
        ? ''
        : ($returnTo !== null
            ? ('forum-masseur-weekly-' . $masseurId)
            : ('masseur-' . $masseurId));
    if ($r['ok']) {
        $msg = '已送出本週推薦！（本週 ' . (int) $r['used'] . '/' . (int) $r['max'] . ' 位）';
        if ($returnTo !== null && str_starts_with($returnTo, 'masseur_weekly.php')) {
            fate_masseur_back($storeId, $msg, '', '');
        }
        fate_masseur_back($storeId, $msg, '', $anchor);
    }
    fate_masseur_back($storeId, '', $r['error'] ?? '本週推薦失敗。', $anchor);
}

if ($action === 'favorite') {
    require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'fate_masseur_favorites.php';
    $masseurId = isset($_POST['masseur_id']) ? (int) $_POST['masseur_id'] : 0;
    $masseur = fate_masseur_get($pdo, $masseurId);
    if ($masseur === null) {
        fate_masseur_back($storeId, '', '找不到技師。');
    }
    if ($storeId <= 0) {
        $storeId = (int) ($masseur['spa_store_id'] ?? 0);
    }
    $r = fate_masseur_favorite_toggle($pdo, $memberId, $masseurId);
    $returnTo = fate_masseur_sanitize_return_to(isset($_POST['return_to']) ? (string) $_POST['return_to'] : null);
    $anchor = fate_masseur_back_anchor($returnTo, $masseurId);
    if ($r['ok']) {
        $label = $r['favorited'] ? '已加入收藏。' : '已取消收藏。';
        fate_masseur_back($storeId, $label, '', $anchor);
    }
    fate_masseur_back($storeId, '', $r['error'] ?? '收藏操作失敗。', $anchor);
}

fate_masseur_back($storeId, '', '未知的動作。');
