<?php

namespace App\Enums\Hotel;

enum CustomerSegment: string
{
    case OCCASIONAL = 'occasional';
    case FREQUENT   = 'frequent';
    case CORPORATE  = 'corporate';
    case VIP        = 'vip';

    /**
     * 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']['clients']['customer_segment'];

        return match ($this) {
            self::OCCASIONAL    => $lang_enum['occasional'],
            self::FREQUENT      => $lang_enum['frequent'],
            self::CORPORATE     => $lang_enum['corporate'],
            self::VIP           => $lang_enum['vip'],
        };
    }

    /**
     * Obtiene la etiqueta traducida desde diversos tipos de valores:
     *
     * - Un valor del enum (CustomerSegment)
     * - Un string con el valor del enum ('001', '002', 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;
    }

    /**
     * Obtiene el nivel de prioridad del cliente.
     *
     * Puede ser utilizado para ordenamiento o decisiones operativas.
     *
     * @return int
     */
    public function priority(): int
    {
        return match ($this) {
            self::OCCASIONAL => 1,
            self::FREQUENT   => 2,
            self::CORPORATE  => 3,
            self::VIP        => 4,
        };
    }

    /**
     * Indica si el cliente es considerado de alto valor.
     *
     * @return bool
     */
    public function isHighValue(): bool
    {
        return match ($this) {
            self::CORPORATE, self::VIP => true,
            default                    => false,
        };
    }

    /**
     * Indica si el cliente es VIP.
     *
     * @return bool
     */
    public function isVip(): bool
    {
        return $this === self::VIP;
    }

    /**
     * Obtiene el color asociado al segmento del cliente.
     *
     * Útil para badges, etiquetas o UI.
     *
     * @return string Hex Color
     */
    public function color(): string
    {
        return match ($this) {
            self::OCCASIONAL => '#A0AEB2', // Gris neutro
            self::FREQUENT   => '#2C8FA3', // Azul claro
            self::CORPORATE  => '#6A4C93', // Morado corporativo elegante
            // self::CORPORATE => '#1F6F8B',  // Harsi Color
            self::VIP        => '#D4AF37', // Dorado (VIP real)
            // self::VIP        => '#CFAF4D', // Dorado Elegante
        };
    }

    public function badgeClass(): string
    {
        return match ($this) {
            self::OCCASIONAL => 'background-color: #A0AEB24D; color: #546770;',
            self::FREQUENT   => 'background-color: #2C8FA326; color: #2C8FA3;',
            self::CORPORATE  => 'background-color: #6A4C9326; color: #6A4C93;',
            self::VIP        => 'background-color: #c8a53463; color: #9d7f25;',
        };
    }
}
