<?php

/**
 * 文件功能：VIP 会员服务层
 * 提供倍率计算、会员授予/撤销、模板渲染等核心逻辑
 *
 * @author   ChatRoom Laravel
 *
 * @version  1.0.0
 */

namespace App\Services;

use App\Models\User;
use App\Models\VipLevel;

class VipService
{
    /**
     * 获取用户的经验倍率（非 VIP 返回 1.0）
     */
    public function getExpMultiplier(User $user): float
    {
        if (! $user->isVip()) {
            return 1.0;
        }

        return $user->vipLevel?->exp_multiplier ?? 1.0;
    }

    /**
     * 获取用户的金币倍率（非 VIP 返回 1.0）
     */
    public function getJjbMultiplier(User $user): float
    {
        if (! $user->isVip()) {
            return 1.0;
        }

        return $user->vipLevel?->jjb_multiplier ?? 1.0;
    }

    /**
     * 授予用户 VIP 等级
     *
     * @param  User  $user  目标用户
     * @param  int  $vipLevelId  VIP 等级 ID
     * @param  int  $days  天数（0=永久）
     * @param  bool  $isUpgrade  是否为补差价升级
     */
    public function grantVip(User $user, int $vipLevelId, int $days = 30, bool $isUpgrade = false): void
    {
        $oldVipId = $user->vip_level_id;
        $user->vip_level_id = $vipLevelId;

        if ($days > 0) {
            if ($isUpgrade && $oldVipId && $user->hy_time && $user->hy_time->isFuture()) {
                // 如果是升级，到期日期保持不变，除非新等级是永久（days=0）
                // 此时只需更新等级 ID，无需修改 hy_time。
            } else {
                // 如果是新购或续费，在现有到期时间上延长
                $baseTime = ($user->hy_time && $user->hy_time->isFuture())
                    ? $user->hy_time
                    : now();
                $user->hy_time = $baseTime->addDays($days);
            }
        } else {
            // 永久会员
            $user->hy_time = null;
        }

        $user->save();
    }

    /**
     * 撤销用户 VIP 等级
     */
    public function revokeVip(User $user): void
    {
        $user->vip_level_id = null;
        $user->hy_time = null;
        $user->save();
    }

    /**
     * 获取用户专属进入聊天室的欢迎语（非 VIP 返回 null）
     *
     * @param  User  $user  用户
     * @return string|null 渲染后的欢迎语
     */
    public function getJoinMessage(User $user): ?string
    {
        if (! $user->isVip() || ! $user->vipLevel) {
            return null;
        }

        $templates = $user->vipLevel->join_templates_array;

        return VipLevel::renderTemplate($templates, $user->username);
    }

    /**
     * 获取用户专属离开聊天室的提示语（非 VIP 返回 null）
     */
    public function getLeaveMessage(User $user): ?string
    {
        if (! $user->isVip() || ! $user->vipLevel) {
            return null;
        }

        $templates = $user->vipLevel->leave_templates_array;

        return VipLevel::renderTemplate($templates, $user->username);
    }
}
