<?php

namespace App\Http\Controllers;

use App\Mail\CredencialesDenuncianteMail;
use App\Models\Denuncia;
use App\Models\Parametro;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use murtaza1904\AvatarGenerator\Facades\Avatar;

class PublicDenunciaController extends Controller
{
    public function welcome()
    {
        $departamentos = [
            'La Paz',
            'Cochabamba',
            'Santa Cruz',
            'Oruro',
            'Potosí',
            'Chuquisaca',
            'Tarija',
            'Beni',
            'Pando',
        ];

        $tiposDenuncia=Parametro::where('tipo', 'tipo_denuncia')->get();

        return view('welcome', compact('departamentos','tiposDenuncia'));
    }

    public function store(Request $request)
    {
        $rules = [
            'tipo_denuncia' => 'required|string',
            'es_anonima' => 'required|boolean',
            'es_reserva' => 'required|boolean',
            
            'relato_hechos' => 'required|string',
            'presento_otra_instancia' => 'required|boolean',

            'institucion_otra_instancia' => 'nullable|required_if:presento_otra_instancia,1|string|max:255',
            'fecha_presentacion_otra_instancia' => 'nullable|required_if:presento_otra_instancia,1|date',

            'denunciados' => 'required|array|min:1',
            'denunciados.*.nombre_completo' => 'required|string|max:255',
            'denunciados.*.lugar_trabajo' => 'required|string|max:255',
            'denunciados.*.area_trabajo' => 'required|string|max:255',

            'pruebas' => 'nullable|array',
            'pruebas.*' => 'file|max:10240|mimes:pdf,jpg,jpeg,png,webp',
        ];

        if (!$request->boolean('es_anonima')) {
            $rules = array_merge($rules, [
                'nombres' => 'required|string|max:255',
                'apellido_paterno' => 'required|string|max:255',
                'apellido_materno' => 'nullable|string|max:255',
                'sexo' => 'required|in:Femenino,Masculino',
                'direccion_domicilio' => 'required|string|max:255',
                'departamento_residencia' => 'required|string|max:100',
                'tipo_documento' => 'required|in:CI,Pasaporte',
                'numero_documento' => 'required|string|max:50',
                'lugar_emision' => 'required|string|max:100',
                'correo_electronico' => 'required|email|max:255',
                'numero_celular' => 'required|string|max:30',
            ]);
        }

        $request->validate($rules);

        DB::beginTransaction();

        try {
            $user = null;
            $passwordTemporal = null;

            if (!$request->boolean('es_anonima')) {
                $passwordTemporal = Str::random(10);

                $username = $this->generarUsername($request);

                $user = User::create([
                    'name' => trim($request->nombres . ' ' . $request->apellido_paterno . ' ' . $request->apellido_materno),
                    'username' => $username,
                    'email' => $request->correo_electronico,
                    'password' => Hash::make($passwordTemporal),
                    'change_password' => false,
                ])->assignRole('Denunciante');

                Avatar::create($user->name)
                ->filename($user->id.'.png')
                ->path(public_path('/assets/images/avatar/'));
                $user->avatar=$user->id.'.png';
                $user->save();
            }

            $denuncia = Denuncia::create([
                'codigo' => $this->generarCodigo(),
                'tipo_denuncia' => $request->tipo_denuncia,
                'es_anonima' => $request->boolean('es_anonima'),
                'es_reserva' => $request->boolean('es_anonima') ? false : $request->boolean('es_reserva'),

                'nombres' => $request->boolean('es_anonima') ? null : $request->nombres,
                'apellido_paterno' => $request->boolean('es_anonima') ? null : $request->apellido_paterno,
                'apellido_materno' => $request->boolean('es_anonima') ? null : $request->apellido_materno,
                'sexo' => $request->boolean('es_anonima') ? null : $request->sexo,
                'direccion_domicilio' => $request->boolean('es_anonima') ? null : $request->direccion_domicilio,
                'departamento_residencia' => $request->boolean('es_anonima') ? null : $request->departamento_residencia,
                'tipo_documento' => $request->boolean('es_anonima') ? null : $request->tipo_documento,
                'numero_documento' => $request->boolean('es_anonima') ? null : $request->numero_documento,
                'lugar_emision' => $request->boolean('es_anonima') ? null : $request->lugar_emision,
                'correo_electronico' => $request->boolean('es_anonima') ? null : $request->correo_electronico,
                'numero_celular' => $request->numero_celular,

                'relato_hechos' => $request->relato_hechos,
                'presento_otra_instancia' => $request->boolean('presento_otra_instancia'),
                'institucion_otra_instancia' => $request->boolean('presento_otra_instancia')
                    ? $request->institucion_otra_instancia
                    : null,
                'fecha_presentacion_otra_instancia' => $request->boolean('presento_otra_instancia')
                    ? $request->fecha_presentacion_otra_instancia
                    : null,
                'estado_actual' => 'Registrada',
                'created_by' => $user?->id,
                'updated_by' => $user?->id,
            ]);

            foreach ($request->denunciados as $item) {
                $denuncia->denunciados()->create([
                    'nombre_completo' => $item['nombre_completo'],
                    'lugar_trabajo' => $item['lugar_trabajo'] ?? null,
                    'area_trabajo' => $item['area_trabajo'] ?? null,
                ]);
            }

            if ($request->hasFile('pruebas')) {
            foreach ($request->file('pruebas') as $archivo) {
                $nombreOriginal = $archivo->getClientOriginalName();
                $extension = $archivo->getClientOriginalExtension();
                $mimeType = $archivo->getMimeType();
                $peso = $archivo->getSize();

                $nombreArchivo = uniqid('prueba_') . '.' . $extension;

                $ruta = $archivo->storeAs(
                    'denuncias/' . $denuncia->codigo . '/pruebas',
                    $nombreArchivo,
                    'public'
                );

                $denuncia->pruebas()->create([
                    'nombre_original' => $nombreOriginal,
                    'nombre_archivo' => $nombreArchivo,
                    'ruta' => $ruta,
                    'mime_type' => $mimeType,
                    'extension' => $extension,
                    'peso' => $peso,
                ]);
            }
        }

            $denuncia->seguimientos()->create([
                'user_id' => null,
                'estado' => 'Registrada',
                'observacion' => 'La denuncia fue registrada correctamente.',
                'visible_denunciante' => true,
            ]);

            DB::commit();

            if ($user && $request->correo_electronico) {
                Mail::to($request->correo_electronico)
                    ->send(new CredencialesDenuncianteMail($user, $denuncia, $passwordTemporal));
            }
            if($request->correo_electronico){
                $mensaje = 'Su denuncia fue registrada correctamente. Código: ' . $denuncia->codigo .'<br> Se le enviara al correo electronico: ' . $request->correo_electronico . ' las credenciales para ingresar al sistema y realizar el seguimiento a su denuncia.';
            }
            else{
                $mensaje = 'Su denuncia fue registrada correctamente. Código: ' . $denuncia->codigo;
            }
            return redirect()
                ->route('welcome')
                ->with('success', $mensaje);

        } catch (\Throwable $e) {
            DB::rollBack();

            return back()
                ->withInput()
                ->withErrors([
                    'error' => 'Ocurrió un error al registrar la denuncia: ' . $e->getMessage()
                ]);
        }
    }

    private function generarCodigo(): string
    {
        $ultimoId = Denuncia::withTrashed()->max('id') + 1;

        return 'SEDEM\GG\UTLCC\DEN-' . date('Y') . '-' . str_pad($ultimoId, 5, '0', STR_PAD_LEFT);
    }

    private function generarUsername(Request $request): string
    {
        $base = strtolower(substr($request->nombres, 0, 1) . $request->apellido_paterno);
        $base = preg_replace('/[^a-z0-9]/', '', $base);

        $username = $base;
        $contador = 1;

        while (User::where('username', $username)->exists()) {
            $username = $base . $contador;
            $contador++;
        }

        return $username;
    }
}