<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Http\Resources\DefaultCollection;
use App\Models\Admin\Interna;
use App\Models\Admin\Modulos;
use App\Models\Admin\Secciones;
use App\Models\Files;
use App\Models\Promociones;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

class ArchivosController extends Controller
{
    public function index(): DefaultCollection
    {
        $size = request('page.size', 10);
        $page = request('page.number', 1);

        $sort = request('sort', null);

        $result = Files::selectFillable()
            ->with('archivable')
            ->whereIn('archivable_type', $this->valid_models)
            ->where('key', 'operadores')
            ->applySorts($sort, 'id')
            ->groupBy('id')
            ->filterLike(request('filter', []))
            ->orderByDesc('id') 
            ->paginate($size, ['id'], 'page[number]', $page);

        $result->getCollection()->each(function ($item) {
            $item->tipo = ucfirst(array_search($item->archivable_type, $this->valid_models));
        });

        return DefaultCollection::make($result);
    }

    public function store(Request $request): Files
    {
        //? Aumentar el tamaño maximo del post
        ini_set('upload_max_filesize', '500M');
        ini_set('post_max_size', '500M');

        $archivo = $request->file('archivo', null);
        $modelo = $this->getModel($request->get('modulo', null));
        $id = $request->get('archivable_id', null);

        $fileController = new Files();

        return $fileController->upload(
            $archivo,
            $modelo,
            $id,
            'operadores'
        );
    }

    public function destroy($id): Response
    {
        $files = Files::find($id);
        $files->delete();

        return response()->noContent();
    }

    private array $valid_models = [
        'noticias' => Interna::class,
        'promociones' => Promociones::class,
    ];

    private function getModel($model_key)
    {
        $key = strtolower($model_key);
        return $this->valid_models[$key] ? $this->valid_models[$key] : null;
    }

    public function getModulos(): array
    {
        $modulo = Modulos::slug('noticias')
            ->activo()
            ->selectFillable()
            ->first();

        return [
            [
                'slug' => 'noticias',
                'titulo' => 'Noticias',
                'children' => Interna::modulo($modulo->id)
                    ->where('operadores', true)
                    ->select('id', 'titulo')
                    ->get(),
            ],
            [
                'slug' => 'promociones',
                'titulo' => 'Promociones',
                'children' => Promociones::where('operadores', true)
                    ->select('id', 'titulo')
                    ->get(),
            ],
        ];
    }
}
