<?php

namespace App\Enums\Hotel;

use App\Enums\Hotel\BehaviorRisk;

/**
 * Enum que representa el comportamiento registrado de un cliente.
 *
 * Define los distintos tipos de incidencias o estados operativos
 * asociados a un huésped dentro del sistema.
 */
enum BehaviorReport: string
{
    case NONE                 = 'none';
    case MINOR_INCIDENT       = 'minor_incident';
    case ADMINISTRATIVE_ISSUE = 'administrative_issue';
    case POLICY_VIOLATION     = 'policy_violation';
    case PAYMENT_RISK         = 'payment_risk';
    case OPERATIONAL_RISK     = 'operational_risk';
    case NOT_RECOMMENDED      = 'not_recommended';
    case RESTRICTED           = 'restricted';
    case BLACKLISTED          = 'blacklisted';

    /**
     * Obtiene la etiqueta traducida correspondiente al comportamiento del cliente.
     *
     * @return string Etiqueta traducida del valor del enum.
     */
    public function label(): string
    {
        $lang_enum = __('enums')['hotel']['clients']['behavior_report'];

        return match ($this) {
            self::NONE                 => $lang_enum['none'],
            self::MINOR_INCIDENT       => $lang_enum['minor_incident'],
            self::ADMINISTRATIVE_ISSUE => $lang_enum['administrative_issue'],
            self::POLICY_VIOLATION     => $lang_enum['policy_violation'],
            self::PAYMENT_RISK         => $lang_enum['payment_risk'],
            self::OPERATIONAL_RISK     => $lang_enum['operational_risk'],
            self::NOT_RECOMMENDED      => $lang_enum['not_recommended'],
            self::RESTRICTED           => $lang_enum['restricted'],
            self::BLACKLISTED          => $lang_enum['blacklisted'],
        };
    }

    /**
     * Obtiene la configuración de riesgo asociada al comportamiento.
     *
     * @return BehaviorRisk
     */
    public function risk(): BehaviorRisk
    {
        return BehaviorRisk::from($this->value);
    }

    /**
     * Obtiene el puntaje de riesgo del comportamiento.
     *
     * @return int
     */
    public function riskScore(): int
    {
        return $this->risk()->score();
    }

    /**
     * Obtiene el nivel de riesgo del comportamiento.
     *
     * @return string
     */
    public function riskLevel(): string
    {
        return $this->risk()->level();
    }

    /**
     * Obtiene el colo del nivel de riesgo del comportamiento.
     *
     * @return string
     */
    public function riskColor(): string
    {
        return $this->risk()->color();
    }

    /**
     * Obtiene la etiqueta traducida del nivel de riesgo.
     *
     * @return string
     */
    public function riskLevelLabel(): string
    {
        return $this->risk()->levelLabel();
    }

    /**
     * Obtiene la etiqueta traducida desde diversos tipos de valores:
     *
     * - Un valor del enum (BehaviorReport)
     * - Un string con el valor del enum
     *
     * @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 riesgo desde diversos tipos de valores.
     *
     * @param mixed $value
     * @return string|null
     */
    public static function riskLevelFrom(mixed $value): ?string
    {
        if ($value instanceof self)
            return $value->riskLevel();

        if (is_string($value)) {
            return self::tryFrom($value)?->riskLevel();
        }

        return null;
    }
}
