<?php

namespace App\Http\Controllers;

use App\Http\Requests\GruposSuscriptoresRequest;
use App\Http\Resources\DefaultCollection;
use App\Http\Resources\DefaultResource;
use App\Models\GrupoSuscriptor;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\Request;
use Illuminate\Http\Response;

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

        $result = GrupoSuscriptor::query()
            ->selectFillable()
            ->filterLike(request('filter', []))
            ->applySorts(request('sort'))
            ->orderByDesc('id')
            ->paginate(
                $perPage = $size,
                $columns = ['titulo'],
                $pageName = 'page[number]',
                $page = $page
            )->appends(request()->only('sort', 'page.size', 'filter'));

        return DefaultCollection::make($result);
    }

    public function store(GruposSuscriptoresRequest $request): DefaultResource
    {
        $result = GrupoSuscriptor::create($request->all());

        $suscriptores_ids = request('lista_difusion_ids', []);
        $result->suscriptores()->attach($suscriptores_ids);

        return DefaultResource::make($result);
    }

    public function update(GruposSuscriptoresRequest $request, $id): DefaultResource
    {
        $result = GrupoSuscriptor::find($id);
        $result->fill($request->all())->save();

        $suscriptores_ids = request('lista_difusion_ids', []);
        $result->suscriptores()->sync($suscriptores_ids);

        return DefaultResource::make($result);
    }

    public function edit($id): DefaultResource
    {
        $result = GrupoSuscriptor::find($id);
        $result->lista_difusion_ids = $result->suscriptores()->pluck('lista_difusion_id');

        return DefaultResource::make($result);
    }

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

        return response()->noContent();
    }

    public function listar(): Collection
    {
        return GrupoSuscriptor::query()
            ->get();
    }
}
