<?php

namespace App\Support;

/**
 * El comportamiento del estado de publicación, **igual en los siete tipos** (MGR-023).
 *
 * Antes solo `setups` tenía columna de estado, y por eso era el único que filtraba en el
 * resolvedor: los otros seis se servían **en cuanto se creaban**. Ahora lo tienen los siete,
 * y esto vive en un solo sitio — porque el problema que acabábamos de arreglar con
 * {@see ResuelveVersionCompatible} era exactamente ese: la misma regla escrita siete veces,
 * divergiendo sin que nada avise.
 *
 * **Los valores están en {@see EstadoDePublicacion}**, que es una clase: las constantes de un
 * trait solo se pueden leer desde la clase que lo usa, y a los estados los leen también las
 * pantallas y los tests. Aquí queda lo que es comportamiento del modelo.
 *
 * ## Lo que este trait no decide
 *
 * **Qué versión le toca a cada sitio**, que es de `ResuelveVersionCompatible` — y el filtro
 * por estado también vive allí: desde que los siete tipos tienen estado, ese trait aplica
 * `active()` siempre y no hace falta que nadie lo sobrescriba.
 *
 * La separación importa porque son dos reglas distintas —qué versión le toca es negocio, y
 * cuáles están listas es flujo de autoría— y mezclarlas es lo que hacía que `Setup` fuera el
 * raro.
 */
trait TieneEstadoDePublicacion
{
    /**
     * Los tres estados, accesibles desde el modelo.
     *
     * Se redeclaran aquí para poder escribir `FeatureVersion::BORRADOR` en el propio modelo
     * —donde `self::` es lo natural, como en su `duplicate()`—, y apuntan a
     * {@see EstadoDePublicacion} para que **el valor esté definido una vez**.
     */
    public const BORRADOR = EstadoDePublicacion::BORRADOR;

    public const PUBLICADA = EstadoDePublicacion::PUBLICADA;

    public const DESHABILITADA = EstadoDePublicacion::DESHABILITADA;

    public function scopeActive($query)
    {
        return $query->where('status', EstadoDePublicacion::PUBLICADA);
    }

    public function scopeDraft($query)
    {
        return $query->where('status', EstadoDePublicacion::BORRADOR);
    }

    public function scopeDeprecated($query)
    {
        return $query->where('status', EstadoDePublicacion::DESHABILITADA);
    }

    /** ¿Esta versión se le está sirviendo a alguien? */
    public function seSirve(): bool
    {
        return $this->status === EstadoDePublicacion::PUBLICADA;
    }

    public function esBorrador(): bool
    {
        return $this->status === EstadoDePublicacion::BORRADOR;
    }

    /** Cómo se llama su estado en la pantalla. */
    public function etiquetaDeEstado(): string
    {
        return EstadoDePublicacion::etiqueta($this->status);
    }
}
