<?php

namespace Kylin\AntiAddiction\Models;

use Kylin\Core\Models\BaseModel;

/**
 * 法定节假日模型
 *
 * 存储每年的法定节假日日期，用于防沉迷时段判断。
 * 未成年人可在法定节假日的允许时段内游戏。
 *
 * @property int $id
 * @property int $year         年份
 * @property string $name      节假日名称
 * @property array $dates      节假日日期列表（JSON，如 ["2026-01-01", "2026-01-02"]）
 * @property string $country   国家代码（默认 CN）
 */
class Holiday extends BaseModel
{
    protected $table = 'kylin_holidays';

    protected $fillable = [
        'year',
        'name',
        'dates',
        'country',
    ];

    protected $casts = [
        'dates' => 'array',
    ];

    protected $attributes = [
        'country' => 'CN',
    ];

    /**
     * 判断指定日期是否为法定节假日
     */
    public static function isHoliday(string $date, string $country = 'CN'): bool
    {
        $year = substr($date, 0, 4);

        return static::where('year', $year)
            ->where('country', $country)
            ->get()
            ->contains(fn (self $holiday) => in_array($date, $holiday->dates, true));
    }

    /**
     * 获取指定年份的所有节假日日期（扁平化）
     *
     * @return array<string> 日期列表，如 ["2026-01-01", "2026-01-02", ...]
     */
    public static function getDatesByYear(int $year, string $country = 'CN'): array
    {
        return static::where('year', $year)
            ->where('country', $country)
            ->get()
            ->flatMap(fn (self $holiday) => $holiday->dates)
            ->values()
            ->all();
    }
}
