<?php

namespace App\Models;

use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\Model;
use App\Command\Log;
use Illuminate\Support\Facades\DB;
use Exception;
use App\Models\User as UserModel;

class UserPointChangeRec extends Model
{
    use HasDateTimeFormatter;
    protected $table = 'user_point_change_rec';

    public function user()
    {
        return $this->belongsTo(User::class, 'user_id');
    }

    //积分来源定义【source】
    public const source = [
        1 => '直推',
        2 => '间推',
        3 => '购物',
        4 => '退款',
        9 => '手动补偿',
    ];


    /**
     * 用户积分变更记录
     * @param int $user_id 用户ID
     * @param int $point_amount 积分数量
     * @param int $change_type 变更类型:1-增加,0-减少 (默认1)
     * @param int $source 积分来源:1-直推,2-间推,3-购物,4-退款,9-手动补偿 (默认1)
     * @param int $point_state 积分状态:1-已完成,2-解冻中,3-冻结中 (默认1)
     * @param int $order_id 关联订单ID
     * @param string $remark 备注信息
     * @return bool 返回操作结果
     * 
     * 功能说明:
     * 1. 记录用户积分变更情况
     * 2. 仅当point_state=1(已完成)时更新用户余额
     * 3. 记录变更备注信息
     *
     * 使用示例:
     * UserPointChangeRec::pointChangeRecord(1, 100, 1, 1, 1, '订单号:123456');
     * 注意事项:
     * 1. 积分数量必须为正整数
     * 2. 变更类型必须为0或1
     */
    public static function pointChangeRecord($user_id, $point_amount,  $change_type = 1, $source = 1,$point_state = 1,$order_id=0, $remark = '' )
    {
        DB::beginTransaction();
        try {
            // 参数验证
            if ($point_amount <= 0) {
                throw new Exception('积分数量必须大于0');
            }
            if (!in_array($change_type, [0, 1])) {
                throw new Exception('变更类型参数错误');
            }

            // 创建积分变更记录
            DB::table('user_point_change_rec')->insert([
                'user_id' => $user_id,
                'order_id' => $order_id,
                'point_amount' => $point_amount,
                'change_type' => $change_type,
                'point_state' => $point_state,
                'source' => $source,
                'memo' => $remark,
                'created_at' => date('Y-m-d H:i:s')
            ]);

            // 仅当状态为已完成时更新用户余额
            if ($point_state == 1) {
                $user = UserModel::find($user_id);
                if ($change_type == 1) {
                    $user->balance += $point_amount; // 增加积分
                } else {
                    if ($user->balance < $point_amount) {
                        throw new Exception('积分不足');
                    }
                    $user->balance -= $point_amount; // 减少积分
                }
                $user->save();
            }

            DB::commit();
            Log::add('pay', [
                'user_id' => $user_id,
                'point_amount' => $point_amount,
                'change_type' => $change_type,
                'point_state' => $point_state
            ]);
            return true;
        } catch (\Exception $e) {
            DB::rollBack();
            Log::add('pay', [
                'user_id' => $user_id,
                'point_amount' => $point_amount,
                'error' => $e->getMessage()
            ]);
            return false;
        }
    }


    /**
     * 用户积分解冻
     * @param object $orderObj 订单对象
     * @return bool 返回操作结果
     * 
     * 功能说明:
     * 1. 根据订单ID查找对应的积分变更记录
     * 2. 将冻结中的积分状态更新为解冻中
     * 3. 设置7天后的解冻结束日期
     * 
     * 使用示例:
     * $order = OrderInfo::find(123);
     * UserPointChangeRec::point解冻($order);
     * 
     * 注意事项:
     * 1. 仅处理状态为冻结中(3)的积分记录
     * 2. 解冻后状态变为解冻中(2)
     * 3. 解冻结束日期为当前时间+7天
     */
    public static function pointUnfreezeimg($orderObj)
    {
        DB::beginTransaction();
        try {
            // 查找该订单对应的冻结中积分记录
            $records = DB::table('user_point_change_rec')
                ->where([
                    'order_id' => $orderObj->id,
                    'point_state' => 3, // 冻结中
                    'change_type' => 1   // 增加积分
                ])
                ->get();

            if ($records->isEmpty()) {
                Log::add('point_unfreeze', [
                    'order_id' => $orderObj->id,
                    'msg' => '没有找到可解冻的积分记录'
                ]);
            }

            // 设置7天后的解冻结束日期
            $freezeEndDate = date('Y-m-d H:i:s', strtotime('+7 days'));

            // 更新积分记录状态为解冻中
            DB::table('user_point_change_rec')
                ->where('id', $records[0]->id)
                ->update([
                    'point_state' => 2, // 解冻中
                    'freeze_end_date' => $freezeEndDate,
                    'updated_at' => date('Y-m-d H:i:s')
                ]);

            DB::commit();
            Log::add('point_unfreeze', [
                'order_id' => $orderObj->id,
                'point_amount' => $records[0]->point_amount,
                'freeze_end_date' => $freezeEndDate
            ]);
            return true;
        } catch (\Exception $e) {
            DB::rollBack();
            Log::add('point_unfreeze_error', [
                'order_id' => $orderObj->id,
                'error' => $e->getMessage()
            ]);
            return false;
        }
    }


    
}