<?php

namespace App\Http\Controllers\Painel;

use App\Http\Controllers\Controller;
use App\Services\Sefaz\CertificateService;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

class CertificadoController extends Controller
{
    public function edit(Request $request): View
    {
        return view('painel.certificado', ['company' => $request->user()->company]);
    }

    public function update(Request $request, CertificateService $certificados): RedirectResponse
    {
        abort_unless($request->user()->isAdmin() || $request->user()->isMaster(), 403);

        $request->validate([
            'certificado' => ['required', 'file', 'max:512', 'mimetypes:application/x-pkcs12,application/octet-stream,application/pkcs12'],
            'senha' => ['required', 'string', 'max:120'],
        ], [
            'certificado.max' => 'O arquivo do certificado deve ter no máximo 512 KB.',
            'certificado.mimetypes' => 'Envie o arquivo .pfx ou .p12 do certificado A1.',
        ], ['senha' => 'senha do certificado']);

        $extensao = strtolower($request->file('certificado')->getClientOriginalExtension());

        if (! in_array($extensao, ['pfx', 'p12'], true)) {
            return back()->withErrors(['certificado' => 'O certificado precisa ser um arquivo .pfx ou .p12.']);
        }

        try {
            $info = $certificados->store(
                $request->user()->company,
                $request->file('certificado'),
                $request->input('senha'),
            );
        } catch (\Throwable $e) {
            return back()->withErrors(['certificado' => $e->getMessage()]);
        }

        return redirect()
            ->route('painel.certificado')
            ->with('status', 'Certificado instalado. Válido até '.$info['valid_to']->format('d/m/Y').'.');
    }

    public function destroy(Request $request, CertificateService $certificados): RedirectResponse
    {
        abort_unless($request->user()->isAdmin() || $request->user()->isMaster(), 403);

        $company = $request->user()->company;

        $certificados->forget($company, persist: true);
        $company->forceFill(['monitor_enabled' => false])->save();

        return back()->with('status', 'Certificado removido e monitor desativado.');
    }
}
