<?php

namespace App\Http\Controllers\Api\Admin\V1;

use App\Http\Resources\Admin\V1\CatalogoResource;
use App\Http\Resources\Admin\V1\ProductResource;
use App\Models\Environments\Env;
use App\Models\Environments\Type;
use App\Models\Products\Product;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;

/**
 * Los catálogos que hacen falta para dar de alta un sitio: plataformas (`types`), usos
 * (`envs`) y productos. Solo lectura y sin paginar: son unas decenas de filas y se
 * mantienen desde el panel.
 */
class CatalogosController extends ControladorDeAdministracion
{
    public function types(Request $request): AnonymousResourceCollection
    {
        $this->validarConsulta($request, ['shortname' => 'nullable|string']);

        $tipos = Type::query()
            ->when($request->filled('shortname'), fn ($q) => $q->where('shortname', $request->query('shortname')))
            ->orderBy('id')
            ->get();

        return CatalogoResource::collection($tipos);
    }

    public function envs(Request $request): AnonymousResourceCollection
    {
        $this->validarConsulta($request, ['shortname' => 'nullable|string']);

        $usos = Env::query()
            ->when($request->filled('shortname'), fn ($q) => $q->where('shortname', $request->query('shortname')))
            ->orderBy('orden')
            ->orderBy('name')
            ->get();

        return CatalogoResource::collection($usos);
    }

    /**
     * Solo los productos **activos y habilitados para la venta**: son los únicos que tiene
     * sentido poner en una licencia nueva. Con `type_id`, los compatibles con esa
     * plataforma.
     */
    public function products(Request $request): AnonymousResourceCollection
    {
        $this->validarConsulta($request, [
            'slug' => 'nullable|string',
            'type' => 'nullable|string',
            'tech' => 'nullable|string',
            'type_id' => 'nullable|integer',
        ]);

        $productos = Product::query()
            ->with('types:id')
            ->where('actived', true)
            ->where('enabled', true)
            ->when($request->filled('slug'), fn ($q) => $q->where('slug', $request->query('slug')))
            ->when($request->filled('type'), fn ($q) => $q->where('type', $request->query('type')))
            ->when($request->filled('tech'), fn ($q) => $q->where('tech', $request->query('tech')))
            ->when($request->filled('type_id'), fn ($q) => $q->whereHas(
                'types',
                fn ($t) => $t->where('types.id', (int) $request->query('type_id'))
            ))
            ->orderBy('id')
            ->get();

        return ProductResource::collection($productos);
    }
}
