<?php

namespace App\Http\Resources\Admin\V1;

use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

/**
 * Una licencia, tal como la ve la API de administración (PRODSECU-215).
 *
 * ## El token `3IP-…` solo sale en `GET /license-tokens/{id}`
 *
 * Es la credencial con la que un Moodle pide su licencia. **Una sola puerta**: ni en los
 * listados, ni en el alta, ni en las ediciones. Las demás operaciones sirven para encontrar
 * el id; el token se pide aparte, y así hay un único sitio por el que sale y que vigilar.
 * Por eso es opcional y hay que pedirlo con {@see conToken()}.
 *
 * Las fechas, como `Y-m-d`: la licencia se piensa por días.
 *
 * @mixin \App\Models\Products\LicenseToken
 */
class LicenseTokenResource extends JsonResource
{
    private bool $conToken = false;

    /** Incluye el token `3IP-…`. **Solo en `GET /license-tokens/{id}`**: es la única que lo da. */
    public function conToken(): static
    {
        $this->conToken = true;

        return $this;
    }

    public function toArray(Request $request): array
    {
        $datos = [
            'id' => $this->id,
            'client_id' => $this->client_id,
            'name' => $this->name,
        ];

        if ($this->conToken) {
            $datos['token'] = $this->token;
        }

        return $datos + [
            'active' => (bool) $this->active,
            'start_at' => $this->start_at?->format('Y-m-d'),
            'end_at' => $this->end_at?->format('Y-m-d'),
            // Lo que se puede escribir, se puede leer.
            'observation' => $this->observation,
            'mode' => $this->mode,
            'metadata' => $this->metadata,
            'rate_limit_per_minute' => $this->rate_limit_per_minute !== null ? (int) $this->rate_limit_per_minute : null,
            'environment_ids' => $this->environments->pluck('id')->sort()->values()->all(),
            'products' => $this->products
                ->sortBy('id')
                ->map(fn ($producto) => [
                    'product_id' => $producto->id,
                    'slug' => $producto->slug,
                    'status' => $producto->pivot->status,
                    'start_at' => self::fecha($producto->pivot->start_at),
                    'end_at' => self::fecha($producto->pivot->end_at),
                ])
                ->values()
                ->all(),
        ];
    }

    /** Las fechas del pivote llegan como texto: `withPivot()` no aplica los casts. */
    private static function fecha(mixed $valor): ?string
    {
        return $valor ? Carbon::parse($valor)->format('Y-m-d') : null;
    }
}
