<?php

namespace App\Enums;

/**
 * 店铺服务状态枚举类
 */
enum ShopServiceStatus: int
{
    /**
     * 服务状态:可预约
     */
    case AVAILABLE = 1;

    /**
     * 服务状态:繁忙中
     */
    case BUSY = 2;

    /**
     * 服务状态:不可预约
     */
    case UNAVAILABLE = 3;

    /**
     * 服务状态:维护中
     */
    case MAINTENANCE = 4;

    /**
     * 获取状态的显示文本
     *
     * @return string 状态的中文描述
     */
    public function label(): string
    {
        return match ($this) {
            self::AVAILABLE => '可预约',
            self::BUSY => '繁忙中',
            self::UNAVAILABLE => '不可预约',
            self::MAINTENANCE => '维护中',
        };
    }

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

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

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

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

    /**
     * 获取所有状态的键值对数组
     *
     * @return array 状态值作为键,显示文本作为值的关联数组
     */
    public static function all(): array
    {
        return [
            self::AVAILABLE->value => self::AVAILABLE->label(),
            self::BUSY->value => self::BUSY->label(),
            self::UNAVAILABLE->value => self::UNAVAILABLE->label(),
            self::MAINTENANCE->value => self::MAINTENANCE->label(),
        ];
    }
}