<?php

namespace Kylin\AntiAddiction\Enums;

/**
 * 年龄分组枚举
 *
 * 依据国家新闻出版署《关于防止未成年人沉迷网络游戏的通知》（国新出发〔2019〕34号）
 * 及《关于进一步严格管理 切实防止未成年人沉迷网络游戏的通知》划分：
 * - child:        <8 周岁，禁止充值，仅可在规定时段游戏1小时
 * - junior_minor: 8-15 周岁，单次充值≤50元，月累计≤200元
 * - senior_minor: 16-17 周岁，单次充值≤100元，月累计≤400元
 * - adult:        >=18 周岁，无限制
 * - unknown:      未实名，禁止游戏
 */
enum AgeGroup: string
{
    case Child = 'child';
    case JuniorMinor = 'junior_minor';
    case SeniorMinor = 'senior_minor';
    case Adult = 'adult';
    case Unknown = 'unknown';

    /**
     * 是否为未成年人
     */
    public function isMinor(): bool
    {
        return match ($this) {
            self::Child, self::JuniorMinor, self::SeniorMinor => true,
            default => false,
        };
    }

    /**
     * 是否已实名认证
     */
    public function isVerified(): bool
    {
        return $this !== self::Unknown;
    }

    /**
     * 中文标签
     */
    public function label(): string
    {
        return match ($this) {
            self::Child => '儿童（<8周岁）',
            self::JuniorMinor => '少年（8-15周岁）',
            self::SeniorMinor => '青少年（16-17周岁）',
            self::Adult => '成年人',
            self::Unknown => '未实名',
        };
    }

    /**
     * 根据年龄值创建枚举实例
     */
    public static function fromAge(int $age): self
    {
        return match (true) {
            $age < 8 => self::Child,
            $age >= 8 && $age <= 15 => self::JuniorMinor,
            $age >= 16 && $age <= 17 => self::SeniorMinor,
            $age >= 18 => self::Adult,
            default => self::Unknown,
        };
    }
}
