<?php

namespace App\Enums;

/**
 * 业务规则类型枚举类
 */
enum SysRuleType: int
{
    /**
     * 规则类型:订单规则
     */
    case ORDER = 1;

    /**
     * 规则类型:分佣规则
     */
    case COMMISSION = 2;

    /**
     * 规则类型:营销规则
     */
    case MARKETING = 3;

    /**
     * 规则类型:服务规则
     */
    case SERVICE = 4;

    /**
     * 规则类型:其他规则
     */
    case OTHER = 5;

    /**
     * 获取类型的显示文本
     *
     * @return string 类型的中文描述
     */
    public function label(): string
    {
        return match ($this) {
            self::ORDER => '订单规则',
            self::COMMISSION => '分佣规则',
            self::MARKETING => '营销规则',
            self::SERVICE => '服务规则',
            self::OTHER => '其他规则',
        };
    }

    /**
     * 获取类型的整数值
     *
     * @return int 类型值
     */
    public function value(): int
    {
        return $this->value;
    }

    /**
     * 检查当前类型是否与指定类型相同
     *
     * @param self $type 要比较的类型
     * @return bool 如果类型相同返回 true,否则返回 false
     */
    public function is(self $type): bool
    {
        return $this === $type;
    }

    /**
     * 根据整数值创建对应的类型枚举实例
     *
     * @param int $value 类型值
     * @return self|null 返回对应的类型枚举实例,如果值无效则返回 null
     */
    public static function fromValue(int $value): ?self
    {
        return match ($value) {
            self::ORDER->value => self::ORDER,
            self::COMMISSION->value => self::COMMISSION,
            self::MARKETING->value => self::MARKETING,
            self::SERVICE->value => self::SERVICE,
            self::OTHER->value => self::OTHER,
            default => null
        };
    }

    /**
     * 获取所有类型的值数组
     *
     * @return array 包含所有类型值的数组
     */
    public static function values(): array
    {
        return array_column(self::cases(), 'value');
    }

    /**
     * 获取所有类型的键值对数组
     *
     * @return array 类型值作为键,显示文本作为值的关联数组
     */
    public static function all(): array
    {
        return [
            self::ORDER->value => self::ORDER->label(),
            self::COMMISSION->value => self::COMMISSION->label(),
            self::MARKETING->value => self::MARKETING->label(),
            self::SERVICE->value => self::SERVICE->label(),
            self::OTHER->value => self::OTHER->label(),
        ];
    }
}