<?php

namespace app\dao;

use App\model\Signlog;



class SignDao
{
    /**
     * 签到函数
     * 
     */
    public static function Sign($user_id)
    {
        if (self::search_Sign_today($user_id) == 1) {
            return 0;
        }
        $Signlog = new Signlog();
        $Signlog->userid = $user_id;
        $Signlog->save();
        UserRewardDao::sing($user_id, 30);
    }
    /**
     * 查询今天是否签到
     * 0没签到1签到
     */
    public static function search_Sign_today($user_id)
    {
        $today = date('Y-m-d');
        $is_sign = Signlog::where('userid', $user_id)->where('created_at', '>=', $today . " 00:00:00")->count();
        return $is_sign == 0 ? 0 : 1;
    }
    /**
     * 查询当月签到数据
     * 
     */
    public static function search_Sign_tomon($user_id)
    {
        $startTime = date('Y-m-01', time()); //获取该月份的第一天
        $endTime = date('Y-m-t', time()); //获取该月份的最后一天
        $mon_data = Signlog::where('userid', $user_id)->whereBetween('created_at', [$startTime . " 00:00:00", $endTime . " 23:59:59"])->orderBy('created_at', 'ASC')->get();
        $days = [];
        foreach ($mon_data as $sign) {
            // 将签到日期提取出来
            $days[] = $sign->created_at->format('d'); // 格式化为 Y-m-d 格式
        }
        // 获取当前月份的天数
        $days_in_month = date('t');
        for ($day = 1; $day <= $days_in_month; $day++) {
            // 判断该天是否有签到
            if (in_array($day, $days)) {
                $res[$day] = 1; // 已签到
            } else {
                $res[$day] = 0; // 未签到
            }
        }
        return $res;
    }
    /**
     * 查询连续签到天数,并按 7 天一个周期计算
     * 
     * @param int $user_id 用户ID
     * @return int 连续签到的天数
     */
    public static function search_Sign_tolong($user_id)
    {
        // 获取该月份的第一天和最后一天
        $startTime = date('Y-m-01', time()); // 获取该月份的第一天
        $endTime = date('Y-m-t', time()); // 获取该月份的最后一天

        // 查询该用户在当前月份的所有签到记录,筛选出有效签到(未兑换奖励的签到)
        $mon_data = Signlog::where('userid', $user_id)
            ->whereBetween('created_at', [$startTime . " 00:00:00", $endTime . " 23:59:59"])
            ->orderBy('created_at', 'ASC')
            ->get();

        // 签到的日期数组,用于判断哪些天有签到
        $signed_days = [];
        $today = date('d');  // 获取今天的日期(用于判断是否是连续签到)

        // 遍历签到记录,记录没有兑换奖励的签到日期
        foreach ($mon_data as $sign) {
            if ($sign->isexchange == 0) {  // 判断是否没有兑换奖励
                $signed_days[] = $sign->created_at->format('d');  // 保存签到日期的“日”部分
            }
        }

        // 获取当前月份的总天数
        $days_in_month = date('t');
        $sign_days = 0;  // 初始化连续签到天数
        $full_cycles = 0; // 完整周期的数量(每7天为一个周期)

        // 检查从今天开始,是否连续签到
        for ($day = $today; $day >= 1; $day--) {
            // 检查当前日期是否在签到日期数组中
            if (in_array($day, $signed_days)) {
                $sign_days++;  // 连续签到天数加 1
            } else {
                break;  // 一旦发现没有签到,跳出循环
            }

            // 如果连续签到达到 7 天,发放奖励并重置
            if ($sign_days == 7) {
                $today = date('Y-m-d');  // 获取今天的日期
                $todaySign = Signlog::where('userid', $user_id)
                    ->whereDate('created_at', $today) // 查找今天的签到记录
                    ->where('isexchange', 0)  // 确认没有兑换奖励
                    ->first();  // 如果今天没有兑换奖励,则返回记录
        
            // 如果今天没有兑换奖励,则进行奖励
            if ($todaySign) {
                // 赠送奖励
                UserRewardDao::sing($user_id, 500);  // 给用户奖励 500
        
                // 标记为已兑换奖励
                $todaySign->isexchange = 1;  // 假设 isexchange 是控制是否已兑换奖励的字段
                $todaySign->save();  // 保存更新后的签到记录
            }
                $sign_days = 0;  // 重置连续签到天数,开始新的一周期
                $full_cycles++;  // 增加完整周期数
            }
        }

        // 如果在最后的连续签到周期内还不足 7 天,不发放奖励
        if ($sign_days == 0 && $full_cycles > 0) {
            // 返回已经完成的周期数
            return $full_cycles * 7;
        }

        // 返回连续签到的天数
        return $full_cycles * 7 + $sign_days;
    }
}