<?php

namespace App\Enums;

/**
 * 错误策略枚举类
 */
enum SysErrorStrategy: int
{
    /**
     * 错误策略:继续执行
     */
    case CONTINUE = 1;

    /**
     * 错误策略:重试执行
     */
    case RETRY = 2;

    /**
     * 错误策略:跳过执行
     */
    case SKIP = 3;

    /**
     * 错误策略:停止执行
     */
    case STOP = 4;

    /**
     * 获取策略的显示文本
     *
     * @return string 策略的中文描述
     */
    public function label(): string
    {
        return match ($this) {
            self::CONTINUE => '继续执行',
            self::RETRY => '重试执行',
            self::SKIP => '跳过执行',
            self::STOP => '停止执行',
        };
    }

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

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

    /**
     * 根据整数值创建对应的策略枚举实例
     *
     * @param int $value 策略值
     * @return self|null 返回对应的策略枚举实例,如果值无效则返回 null
     */
    public static function fromValue(int $value): ?self
    {
        return match ($value) {
            self::CONTINUE->value => self::CONTINUE,
            self::RETRY->value => self::RETRY,
            self::SKIP->value => self::SKIP,
            self::STOP->value => self::STOP,
            default => null
        };
    }

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

    /**
     * 获取所有策略的键值对数组
     *
     * @return array 策略值作为键,显示文本作为值的关联数组
     */
    public static function all(): array
    {
        return [
            self::CONTINUE->value => self::CONTINUE->label(),
            self::RETRY->value => self::RETRY->label(),
            self::SKIP->value => self::SKIP->label(),
            self::STOP->value => self::STOP->label(),
        ];
    }
}