<?php

namespace App\Enums\Hotel;

enum CycleType: string
{
    case CUSTOM = 'custom';
    case WEEKLY   = 'weekly';

    /**
     * Obtiene la etiqueta traducida correspondiente al Tipo de Huésped.
     *
     * @return string Etiqueta traducida del valor del enum.
     */
    public function label(): string
    {
        $lang_enum = __('enums')['hotel']['seasons']['cycle_type'];

        return match ($this) {
            self::CUSTOM    => $lang_enum['custom'],
            self::WEEKLY    => $lang_enum['weekly'],
        };
    }

    /**
     * Obtiene la etiqueta traducida desde diversos tipos de valores:
     *
     * - Un valor del enum (CycleType)
     * - Un string con el valor del enum ('custom', 'weekly', etc.)
     *
     *
     * @param mixed $value Instancia del enum o string.
     *
     * @return string|null Etiqueta traducida, o null si no se puede determinar.
     */
    public static function labelFrom(mixed $value): ?string
    {
        // Enum value provided
        if ($value instanceof self)
            return $value->label();

        // String Enum value provided
        if (is_string($value)) {
            return self::tryFrom($value)?->label();
        }

        // Not recognized value
        return null;
    }
}
