<?php

namespace App\Http\Controllers;

use App\Http\Requests\RHInformativoRequest;
use App\Http\Resources\RHInformativoResource;
use App\Http\Services\RHInformativoService;
use App\Models\RHInformativo;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class RHInformativoController extends Controller {

    private string $permissao = 'GERENCIADOR_DE_INFORMATIVOS_RECURSOS_HUMANOS';

    public function __construct(
        private readonly RHInformativoService $service,
        private readonly RHInformativoResource $resource
    ) {
        $this->middleware('informativos_recursos_humanos');
    }

    public function index(Request $request): View|RedirectResponse {
        $response = $this->checkPermissao($this->permissao, 'visualizar');

        if ($response instanceof RedirectResponse) {
            return $response;
        }

        $informativos = $this->service->listWithFilters($request, 50);

        return view('admin.informativos_recursos_humanos.index', [
            'informativos' => $informativos,
        ]);
    }

    public function create(): View|RedirectResponse {
        $response = $this->checkPermissao($this->permissao, 'adicionar');

        if ($response instanceof RedirectResponse) {
            return $response;
        }

        return view('admin.informativos_recursos_humanos.create');
    }

    public function store(RHInformativoRequest $request): RedirectResponse {
        $response = $this->checkPermissao($this->permissao, 'adicionar');

        if ($response instanceof RedirectResponse) {
            return $response;
        }

        $request->validated();

        return $this->resource->store($request);
    }

    public function edit(RHInformativo $rHInformativo): View|RedirectResponse {
        $response = $this->checkPermissao($this->permissao, 'editar');

        if ($response instanceof RedirectResponse) {
            return $response;
        }

        if (!$rHInformativo) {
            return redirect('/admin/informativos-recursos-humanos')
                ->with('error', __('Informe não encontrado.'));
        }

        return view('admin.informativos_recursos_humanos.edit', [
            'informativo' => $rHInformativo,
        ]);
    }

    public function update(RHInformativoRequest $request, RHInformativo $rHInformativo): RedirectResponse {
        $response = $this->checkPermissao($this->permissao, 'editar');

        if ($response instanceof RedirectResponse) {
            return $response;
        }

        if (!$rHInformativo) {
            return redirect('/admin/informativos-recursos-humanos')
                ->with('error', __('Informe não encontrado.'));
        }

        $request->validated();

        return $this->resource->update($request, $rHInformativo);
    }

    public function destroy(Request $request, RHInformativo $rHInformativo): RedirectResponse {
        $response = $this->checkPermissao($this->permissao, 'excluir');

        if ($response instanceof RedirectResponse) {
            return $response;
        }

        return $this->resource->destroy($request, $rHInformativo);
    }

    public function status(Request $request, RHInformativo $rHInformativo): RedirectResponse {
        $response = $this->checkPermissao($this->permissao, 'editar');

        if ($response instanceof RedirectResponse) {
            return $response;
        }

        return $this->resource->status($request, $rHInformativo);
    }
}
