<?php

namespace App\Http\Controllers;

use App\Models\Configuracion;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class ConfiguracionController extends Controller
{
    public function edit()
    {
        return view('modulos.configuracion', ['config' => Configuracion::actual()]);
    }

    public function update(Request $request)
    {
        $data = $request->validate([
            'empresa' => 'required|string|max:150',
            'razon_social' => 'nullable|string|max:150',
            'nombre_comercial' => 'nullable|string|max:150',
            'ruc' => 'nullable|string|max:20',
            'direccion' => 'nullable|string|max:200',
            'dir_establecimiento' => 'nullable|string|max:200',
            'telefono' => 'nullable|string|max:40',
            'email' => 'nullable|email|max:150',
            'moneda' => 'required|string|max:10',
            'igv' => 'required|numeric|min:0|max:100',
            'serie_boleta' => 'required|string|max:10',
            'serie_factura' => 'required|string|max:10',
        ], [
            'empresa.required' => 'El nombre de la empresa es obligatorio.',
            'igv.required' => 'El porcentaje de IGV es obligatorio.',
        ]);

        Configuracion::actual()->update($data);

        return redirect()->route('configuracion.index')->with('ok', 'Configuración guardada correctamente.');
    }

    /**
     * Guarda los parámetros específicos del SRI (ambiente, establecimiento,
     * punto de emisión, régimen) y, opcionalmente, un nuevo certificado .p12.
     * Se valida la contraseña del certificado abriéndolo con OpenSSL antes de
     * guardarlo, para no descubrir una contraseña equivocada recién al emitir.
     */
    public function updateSri(Request $request)
    {
        $data = $request->validate([
            'ruc' => 'required|digits:13',
            'sri_ambiente' => 'required|in:1,2',
            'sri_estab' => 'required|string|size:3',
            'sri_pto_emi' => 'required|string|size:3',
            'sri_obligado_contabilidad' => 'required|in:SI,NO',
            'sri_contribuyente_especial' => 'nullable|string|max:20',
            'sri_regimen_rimpe' => 'nullable|string|max:60',
            'sri_agente_retencion' => 'nullable|boolean',
            'sri_activo' => 'nullable|boolean',
            'sri_envio_automatico' => 'nullable|boolean',
            'certificado' => 'nullable|file|max:2048',
            'certificado_password' => 'nullable|string|max:100',
        ], [
            'ruc.digits' => 'El RUC debe tener exactamente 13 dígitos.',
            'sri_estab.size' => 'El código de establecimiento debe tener 3 dígitos (ej. 001).',
            'sri_pto_emi.size' => 'El punto de emisión debe tener 3 dígitos (ej. 001).',
        ]);

        $config = Configuracion::actual();

        if ($request->hasFile('certificado')) {
            if (! $request->filled('certificado_password')) {
                return back()->withInput()->withErrors(['certificado_password' => 'Ingresa la contraseña del certificado que estás subiendo.']);
            }

            $archivo = $request->file('certificado');
            $contenido = file_get_contents($archivo->getRealPath());

            $certs = [];
            if (! openssl_pkcs12_read($contenido, $certs, $data['certificado_password'])) {
                return back()->withInput()->withErrors(['certificado' => 'No se pudo abrir el certificado: revisa que el archivo .p12 y la contraseña sean correctos.']);
            }

            $vencimiento = openssl_x509_parse($certs['cert'])['validTo_time_t'] ?? null;
            if ($vencimiento && $vencimiento < time()) {
                return back()->withInput()->withErrors(['certificado' => 'Este certificado ya está vencido. Sube uno vigente.']);
            }

            // Se guarda fuera de storage/app/public: nunca queda accesible por URL directa.
            if ($config->sri_certificado_path) {
                Storage::disk('local')->delete($config->sri_certificado_path);
            }

            $ruta = rtrim(config('sri.rutas.certificados'), '/').'/'.uniqid('cert_').'.p12';
            Storage::disk('local')->put($ruta, $contenido);

            $data['sri_certificado_path'] = $ruta;
            $data['sri_certificado_password'] = $data['certificado_password'];
        }

        unset($data['certificado'], $data['certificado_password']);

        $data['sri_agente_retencion'] = $request->boolean('sri_agente_retencion');
        $data['sri_activo'] = $request->boolean('sri_activo');
        $data['sri_envio_automatico'] = $request->boolean('sri_envio_automatico');

        $config->update($data);

        return redirect()->route('configuracion.index')->with('ok', 'Configuración del SRI guardada correctamente.');
    }
}
