<?php

namespace App\Services;

use App\Constants\HttpStatus;
use App\Constants\System;
use App\Constants\Util;
use App\Models\ActivityReward;
use App\Models\ActivityUser;
use App\Models\Wallet as WalletModel;
use Exception;
use Illuminate\Database\Eloquent\Builder;

class ActivityUserService extends BaseService
{
    public static string $MODEL = ActivityUser::class;


    public static function getWhere(array $search = []): array
    {
        $where = [];
        if (isset($search['id']) && !empty($search['id'])) {
            $where[] = ['id', '=', $search['id']];
        }
        if (isset($search['title']) && !empty($search['title'])) {
            $where[] = ['title', 'like', "%{$search['title']}%"];
        }

        if (isset($search['status']) && $search['status'] != '') {
            $where[] = ['status', '=', $search['status']];
        }

        if (isset($search['member_id']) && !empty($search['member_id'])) {
            $where[] = ['member_id', '=', $search['member_id']];
        }


        return $where;
    }

    public static function findOne(array $search)
    {
        return static::$MODEL::where(static::getWhere($search))->first();
    }


    /**
     * Update or create
     * @param array $params
     * @return bool
     * @throws Exception
     */
    public static function submit(array $params = []): bool
    {
        if (isset($params['start_time']))
            $params['start_time'] = strtotime($params['start_time'] . " 00:00:00");
        if (isset($params['end_time']))
            $params['end_time'] = strtotime($params['end_time'] . " 23:59:59");
        if (isset($params['detail_image']))
            $params['detail_image'] = Util::replacePartInUrl($params['detail_image']);


        if (!empty($params['id'])) {
            $info = static::findOne(['id' => $params['id']]);
            if (!$info) throw new Exception("操作失败", HttpStatus::CUSTOM_ERROR);
            $info->update($params);
        } else {
            $info = static::$MODEL::create($params);
        }
        return true;
    }

    public static function updateBettingAmount($memberId, $amount)
    {
        $activityUser = static::findOne([
            'member_id' => $memberId,
            'status' => static::$MODEL::STATUS_IN_PROGRESS
        ]);
        if ($activityUser) {
            $activityUser->increment('effective_betting_amount', $amount);
            if ($activityUser->effective_betting_amount >= $activityUser->betting_amount) {
                $activityUser->status = static::$MODEL::STATUS_COMPLETE;
                $activityUser->finish_time = time();
            }
            $activityUser->save();
        }
    }

    public static function finish($id)
    {
        $activityUser = static::findOne(['id' => $id]);
        $activityUser->status = static::$MODEL::STATUS_COMPLETE;
        $activityUser->finish_time = time();
        $activityUser->save();
    }

    /**
     * @throws Exception
     */
    public static function gift($id, $amount, $bettingAmount): void
    {
        $activityUser = static::findOne(['id' => $id]);
        if (!$activityUser) throw new Exception('活动不存在', HttpStatus::CUSTOM_ERROR);
        if ($activityUser->status == static::$MODEL::STATUS_IN_PROGRESS) throw new Exception('充值失败：活动进行中', HttpStatus::CUSTOM_ERROR);
        if ($activityUser->status == static::$MODEL::STATUS_COMPLETE) throw new Exception("充值失败：活动已完成", HttpStatus::CUSTOM_ERROR);
        if ($activityUser->status != static::$MODEL::STATUS_APPLY) throw new Exception('充值失败：状态异常', HttpStatus::CUSTOM_ERROR);
        $activityUser->status = static::$MODEL::STATUS_IN_PROGRESS;
        $activityUser->betting_amount = $bettingAmount;
        $activityUser->gift_amount = $amount;
        $activityUser->effective_betting_amount = 0;
        $activityUser->save();
        $memberId = $activityUser->member_id;
        $res = WalletService::updateBalance($memberId, $amount);
        BalanceLogService::addLog($memberId, $amount, $res['before_balance'], $res['after_balance'], "优惠活动", $activityUser->id, "$activityUser->title; 赠送：$activityUser->gift_amount;  打码量：$activityUser->betting_amount");

        $availableBalance = floatval($res['after_balance']);
        // 去除多余0后，再用 sprintf 补足两位
        $availableBalance = sprintf('%.2f', $availableBalance);
        $text = "余额变动通知\n";
        $text .= "变动金额：" . ($amount > 0 ? '+' : '') . "{$amount}\n";
        $text .= "总余额为：{$availableBalance}\n";
        $text .= "说明：优惠活动赠送";
        TopUpService::notifyTransferSuccess($memberId, $text);
    }
}