<?php

namespace App\Http\Resources;

use App\Helpers\FileUploadHelper;
use App\Http\Controllers\Controller;
use App\Http\Services\RHInformativoService;
use App\Models\RHInformativo;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class RHInformativoResource extends Controller
{
    public function __construct(
        private readonly RHInformativoService $service
    ) {
    }

    protected function deleteFile(?string $path): void
    {
        if (empty($path)) {
            return;
        }

        $ds = DIRECTORY_SEPARATOR;
        $search = "pmar{$ds}assets{$ds}files";
        $filePath = storage_path() . str_replace($search, "{$ds}app{$ds}public", $path);

        if (file_exists($filePath)) {
            @unlink($filePath);
        }
    }

    protected function buildDataFromRequest(Request $request, ?RHInformativo $informativo = null): array
    {
        if ($request->categoria === 'INFORMATIVOS_DO_RH') {
            $request->merge(['numero' => '']);
        }

        $data = [
            'categoria' => $request->categoria,
            'tipo' => $request->tipo,
            'dataPublicacao' => $request->dataPublicacao,
            'numero' => $request->numero,
            'descricao' => $request->descricao,
            'arquivo' => $informativo?->arquivo ?? null,
            'status' => $request->status,
        ];

        if ($request->hasFile('arquivo') && $request->file('arquivo')->isValid()) {
            if ($informativo && $informativo->arquivo) {
                $this->deleteFile($informativo->arquivo);
            }

            $file = $request->file('arquivo');
            $uploadedPath = FileUploadHelper::processSafeDocumentUpload($file, 'arquivos');

            if ($uploadedPath) {
                $data['arquivo'] = $uploadedPath;
            } else {
                throw new \RuntimeException(__('Erro ao fazer upload do arquivo.'));
            }
        } elseif (!$informativo) {
            throw new \RuntimeException(__('Erro ao fazer upload do arquivo.'));
        }

        return $data;
    }

    public function store(Request $request): RedirectResponse
    {
        try {
            DB::beginTransaction();

            $data = $this->buildDataFromRequest($request);
            $this->service->create($data);

            DB::commit();

            $page = $request->input('page', 1);

            return redirect("/admin/informativos-recursos-humanos?page={$page}")
                ->with('success', __('* Informe criado com sucesso!'));
        } catch (\Throwable $e) {
            DB::rollBack();

            $message = $e instanceof \RuntimeException
                ? $e->getMessage()
                : __('Erro tentar adiciona um novo informe.') . ' ' . $e->getMessage();

            return redirect()
                ->back()
                ->withInput()
                ->with('error', $message);
        }
    }

    public function update(Request $request, RHInformativo $informativo): RedirectResponse
    {
        try {
            DB::beginTransaction();

            $data = $this->buildDataFromRequest($request, $informativo);
            $this->service->update($informativo, $data);

            DB::commit();

            $page = $request->input('page', 1);

            return redirect("/admin/informativos-recursos-humanos?page={$page}")
                ->with('success', __('* Informe atualizado com sucesso!'));
        } catch (\Throwable $e) {
            DB::rollBack();

            $message = $e instanceof \RuntimeException
                ? $e->getMessage()
                : __('Erro tentar atualizar este informe.') . ' ' . $e->getMessage();

            return redirect()
                ->back()
                ->withInput()
                ->with('error', $message);
        }
    }

    public function destroy(Request $request, RHInformativo $informativo): RedirectResponse
    {
        try {
            DB::beginTransaction();

            $this->deleteFile($informativo->arquivo);
            $this->service->delete($informativo);

            DB::commit();

            $page = $request->input('page', 1);

            return redirect("/admin/informativos-recursos-humanos?page={$page}")
                ->with('success', __('* O informe foi excluído com sucesso! Esta ação não pode ser desfeita!'));
        } catch (\Throwable $e) {
            DB::rollBack();

            return redirect()
                ->back()
                ->withInput()
                ->with('error', __('Erro tentar excluir este informe.') . ' ' . $e->getMessage());
        }
    }

    public function status(Request $request, RHInformativo $informativo): RedirectResponse
    {
        try {
            DB::beginTransaction();

            $this->service->updateStatus($informativo, $request->checkStatus);

            DB::commit();

            $page = $request->input('page', 1);

            return redirect("/admin/informativos-recursos-humanos?page={$page}")
                ->with('success', __('* O status do informe foi atualizado com sucesso!'));
        } catch (\Throwable $e) {
            DB::rollBack();

            return redirect()
                ->back()
                ->withInput()
                ->with('error', __('Erro ao tentar alterar o status deste informe.') . ' ' . $e->getMessage());
        }
    }
}

