<?php

namespace App\Http\Controllers;

use App\Models\Proceso;
use App\Models\Parametro;
use App\Models\ParCiudad;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\ProcesoRequest;
use Barryvdh\Snappy\Facades\SnappyPdf;
use RealRashid\SweetAlert\Facades\Alert;

class ProcesoController extends Controller
{
    public function index()
    {
        $procesos = Proceso::where('estado', true)->with('tipo_proceso')->orderBy('fecha_inicio', 'desc')->paginate(10);
        $estados_proceso=Parametro::where('tipo','ESTADO_PROCESO')->get();
        $title = 'Delete User!';
        $text = "Are you sure you want to delete?";
        confirmDelete($title, $text);
        return view('procesos.index', compact('procesos','estados_proceso'));
    }

    public function procesos_finalizados()
    {
        $procesos = Proceso::where('estado', false)->with('tipo_proceso')->orderBy('fecha_inicio', 'desc')->paginate(10);
        $estados_proceso=Parametro::where('tipo','ESTADO_PROCESO')->get();
        $title = 'Delete User!';
        $text = "Are you sure you want to delete?";
        confirmDelete($title, $text);
        return view('procesos.finalizados', compact('procesos','estados_proceso'));
    }
    
    public function create()
    {
        $tipos_proceso = Parametro::where('tipo', 'TIPO_PROCESO')->get();
        $tipos_parte_demandante = Parametro::where('tipo', 'TIPO_DEMANDANTE')->get();
        $tipos_delito = Parametro::where('tipo', 'TIPO_DELITO')->get();
        $tipos_participante = Parametro::where('tipo', 'TIPO_PARTICIPANTE')->get();
        $departamentos=ParCiudad::distinct()->orderBy('cod_depto')->get(['cod_depto','depto_nombre']);
        $proceso=new Proceso();
        return view('procesos.create', compact('tipos_proceso', 'departamentos', 'tipos_parte_demandante', 'tipos_delito', 'tipos_participante','proceso'));
    }

    public function datos_proceso(Request $request)
    {
        $proceso = Proceso::find($request->proceso_id); 

        return response()->json([
            'descripcion_proceso'=>$proceso->descripcion_proceso,
            'nurej'=>$proceso->numero_nurej,
            'departamento'=>$proceso->ciudad->depto_nombre,
            'ciudad'=>$proceso->ciudad->ciudad_nombre,
            'tipo_delito'=>$proceso->tipo_delito->nombre,
            'daño_economico'=>$proceso->daño_economico]);
    }
    
    public function store(ProcesoRequest $request)
    {
        DB::transaction(function () use ($request) {

            $proceso = Proceso::create([
                'fecha_inicio' => $request->fecha_inicio,
                'numero_nurej' => $request->numero_nurej,
                'numero_cud' => $request->numero_cud,
                'numero_expediente' => $request->numero_expediente,
                'numero_caso' => $request->numero_caso,
                'id_contraloria' => $request->id_contraloria,

                'ciudad_id' => $request->ciudad_id,
                'descripcion_proceso' => $request->descripcion_proceso,

                'tipo_delito_id' => $request->tipo_delito_id,
                'tipo_proceso_id' => $request->tipo_proceso_id,

                'tipo_parte_demandante_id' => $request->tipo_parte_demandante_id,
                'parte_demandante' => $request->parte_demandante,

                'juzgado' => $request->juzgado,
                'daño_economico' => $request->daño_economico,

                'user_id' => Auth::user()->id,
            ]);

            if ($request->filled('participantes')) {
                foreach ($request->participantes as $p) {
                    $proceso->participantes()->create([
                        'tipo_participante_id' => $p['tipo'],
                        'nombre_participante' => $p['nombre'],
                        'contacto_participante' => $p['contacto'] ?? null,
                    ]);
                }
            }
        });
        Alert::success('Éxito', 'Proceso judicial creado exitosamente.');
        return redirect()->route('procesos.index');
    }

    public function show(Proceso $proceso)
    {
        //
    }

    public function edit(Proceso $proceso)
    {
        $tipos_proceso = Parametro::where('tipo', 'TIPO_PROCESO')->get();
        $tipos_parte_demandante = Parametro::where('tipo', 'TIPO_DEMANDANTE')->get();
        $tipos_delito = Parametro::where('tipo', 'TIPO_DELITO')->get();
        $tipos_participante = Parametro::where('tipo', 'TIPO_PARTICIPANTE')->get();
        $departamentos=ParCiudad::distinct()->orderBy('cod_depto')->get(['cod_depto','depto_nombre']);
        $ciudad = ParCiudad::find($proceso->ciudad_id);
        //dd($ciudad);
        return view('procesos.edit', [
            'proceso' => $proceso,
            'tipos_proceso'=>$tipos_proceso,
            'tipos_parte_demandante'=>$tipos_parte_demandante,
            'departamentos'=>$departamentos,
            'tipos_delito'=>$tipos_delito,
            'tipos_participante'=>$tipos_participante,
            'departamento_id' => $ciudad->depto_nombre,
            'provincia_id'    => $ciudad->cod_provincia,
            'municipio_id'    => $ciudad->cod_municipio,
            'ciudad_id'       => $ciudad->id,
            'participantes' => $proceso->participantes->map(function ($p) {
                return [
                    'tipoTexto'=>$p->tipo_participante->nombre,
                    'tipo' => $p->tipo_participante_id,
                    'nombre' => $p->nombre_participante,
                    'contacto' => $p->contacto_participante,
                ];
            })->values()
        ]);
    }

    public function update(ProcesoRequest $request, Proceso $proceso)
    {
        DB::transaction(function () use ($request, $proceso) {

            $proceso->update([
                'fecha_inicio' => $request->fecha_inicio,
                'numero_nurej' => $request->numero_nurej,
                'numero_cud' => $request->numero_cud,
                'numero_expediente' => $request->numero_expediente,
                'numero_caso' => $request->numero_caso,
                'id_contraloria' => $request->id_contraloria,

                'ciudad_id' => $request->ciudad_id,
                'descripcion_proceso' => $request->descripcion_proceso,

                'tipo_delito_id' => $request->tipo_delito_id,
                'tipo_proceso_id' => $request->tipo_proceso_id,

                'tipo_parte_demandante_id' => $request->tipo_parte_demandante_id,
                'parte_demandante' => $request->parte_demandante,

                'juzgado' => $request->juzgado,
                'daño_economico' => $request->daño_economico,
            ]);

            $proceso->participantes()->delete();

            if ($request->filled('participantes')) {
                foreach ($request->participantes as $p) {
                    $proceso->participantes()->create([
                        'tipo_participante_id' => $p['tipo'],
                        'nombre_participante' => $p['nombre'],
                        'contacto_participante' => $p['contacto'] ?? null,
                    ]);
                }
            }
        });

        Alert::success('Éxito', 'Proceso judicial actualizado correctamente.');
        return redirect()->route('procesos.index');
    }


    public function destroy(Proceso $proceso)
    {
        $proceso->delete();
        Alert::success('Éxito', 'Proceso judicial eliminado exitosamente.');
        return redirect()->route('procesos.index');
    }

    public function pdf(Proceso $proceso)
    {
        $proceso->load(['seguimientos']);
        $titulo='Datos del Proceso Judicial - Código: '.$proceso->codigo_proceso;
        $pdf = SnappyPdf::loadView('procesos.show.contenido', compact('proceso'))
            ->setOption('header-html', view('procesos.show._header', compact('titulo')))
            ->setOption('footer-html', view('procesos.show._footer'))
            ->setOption('margin-top', '2cm')
            ->setOption('margin-bottom', '1.5cm')
            ->setOption('encoding', 'UTF-8')
            ->setOption('enable-local-file-access', true);

        return $pdf->stream('proceso_'.$proceso->codigo_proceso.'.pdf');
    }


}
