<?php

namespace App\Services;

use App\Models\Proceso;
use App\Models\Cliente;
use App\Models\User;
use App\Models\Actuacion;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;

class ReporteService
{
    /**
     * Reporte de Cartera por Cliente
     */
    public static function carteraPorCliente(?int $clienteId = null, ?string $fechaCorte = null): Collection
    {
        $fechaCorte = $fechaCorte ? Carbon::parse($fechaCorte) : now();
        
        $query = Proceso::query()
            ->with(['cliente', 'deudor'])
            ->whereNotIn('estado', ['terminado', 'archivado'])
            ->select([
                'procesos.*',
                DB::raw('DATEDIFF(CURDATE(), fecha_radicacion) as dias_mora'),
            ]);
        
        if ($clienteId) {
            $query->where('cliente_corporativo_id', $clienteId);
        }
        
        return $query->get()->map(function ($proceso) {
            return [
                'cliente' => $proceso->cliente->nombre ?? 'N/A',
                'radicado' => $proceso->radicado_interno,
                'deudor' => $proceso->deudor->nombre_completo ?? 'N/A',
                'obligacion' => $proceso->numero_obligacion,
                'capital' => $proceso->cuantia_total,
                'intereses' => $proceso->cuantia_total ?? 0,
                'honorarios' => $proceso->cuantia_total ?? 0,
                'total' => $proceso->cuantia_total,
                'estado' => $proceso->estado_label,
                'etapa' => $proceso->etapa_procesal_label ?? 'N/A',
                'dias_mora' => $proceso->dias_mora ?? 0,
                'fecha_radicacion' => $proceso->fecha_radicacion?->format('d/m/Y'),
                'abogado' => $proceso->asignacionesActivas->first()?->user?->name ?? 'Sin asignar',
            ];
        });
    }

    /**
     * Reporte Planilla de Procesos
     */
    public static function planillaProcesos(?int $clienteId = null, ?string $estado = null): Collection
    {
        $query = Proceso::query()
            ->with(['cliente', 'deudor', 'juzgadoRelacion', 'asignacionesActivas.user', 'actuaciones' => function($q) {
                $q->latest('fecha_actuacion')->limit(1);
            }]);
        
        if ($clienteId) {
            $query->where('cliente_corporativo_id', $clienteId);
        }
        
        if ($estado) {
            $query->where('estado', $estado);
        }
        
        return $query->get()->map(function ($proceso) {
            $ultimaActuacion = $proceso->actuaciones->first();
            
            return [
                'radicado_interno' => $proceso->radicado_interno,
                'radicado_juzgado' => $proceso->radicado_juzgado,
                'cliente' => $proceso->cliente->nombre ?? 'N/A',
                'deudor' => $proceso->deudor->nombre_completo ?? 'N/A',
                'cedula_deudor' => $proceso->deudor->numero_documento ?? 'N/A',
                'obligacion' => $proceso->numero_obligacion,
                'juzgado' => $proceso->juzgado,
                'cuantia_total' => $proceso->cuantia_total,
                'cuantia_total' => $proceso->cuantia_total,
                'estado' => $proceso->estado_label,
                'etapa' => $proceso->etapa_procesal_label ?? 'N/A',
                'fecha_radicacion' => $proceso->fecha_radicacion?->format('d/m/Y'),
                'ultima_actuacion' => $ultimaActuacion?->descripcion ?? 'Sin actuaciones',
                'fecha_ultima_actuacion' => $ultimaActuacion?->fecha_actuacion?->format('d/m/Y') ?? 'N/A',
                'abogado' => $proceso->asignacionesActivas->where('rol_asignado', 'abogado')->first()?->user?->name ?? 'Sin asignar',
                'dependiente' => $proceso->asignacionesActivas->where('rol_asignado', 'dependiente')->first()?->user?->name ?? 'Sin asignar',
            ];
        });
    }

    /**
     * Reporte de Productividad por Usuario
     */
    public static function productividadUsuario(?int $userId = null, ?string $fechaInicio = null, ?string $fechaFin = null): Collection
    {
        $fechaInicio = $fechaInicio ? Carbon::parse($fechaInicio) : now()->startOfMonth();
        $fechaFin = $fechaFin ? Carbon::parse($fechaFin) : now()->endOfMonth();
        
        $query = User::query()
            ->where('is_active', true)
            ->withCount([
                'actuaciones as actuaciones_periodo' => function ($q) use ($fechaInicio, $fechaFin) {
                    $q->whereBetween('fecha_actuacion', [$fechaInicio, $fechaFin]);
                },
                'asignaciones as procesos_asignados' => function ($q) {
                    $q->where('activa', true);
                },
            ]);
        
        if ($userId) {
            $query->where('id', $userId);
        }
        
        return $query->get()->map(function ($user) use ($fechaInicio, $fechaFin) {
            // Calcular actuaciones por tipo
            $actuacionesPorTipo = Actuacion::where('user_id', $user->id)
                ->whereBetween('fecha_actuacion', [$fechaInicio, $fechaFin])
                ->select('tipo', DB::raw('count(*) as total'))
                ->groupBy('tipo')
                ->pluck('total', 'tipo')
                ->toArray();
            
            return [
                'usuario' => $user->name,
                'email' => $user->email,
                'rol' => $user->rol_label ?? $user->rol,
                'procesos_asignados' => $user->procesos_asignados,
                'actuaciones_periodo' => $user->actuaciones_periodo,
                'autos' => $actuacionesPorTipo['auto'] ?? 0,
                'oficios' => $actuacionesPorTipo['oficio'] ?? 0,
                'notificaciones' => $actuacionesPorTipo['notificacion'] ?? 0,
                'audiencias' => $actuacionesPorTipo['audiencia'] ?? 0,
                'otros' => array_sum($actuacionesPorTipo) - 
                    (($actuacionesPorTipo['auto'] ?? 0) + 
                     ($actuacionesPorTipo['oficio'] ?? 0) + 
                     ($actuacionesPorTipo['notificacion'] ?? 0) + 
                     ($actuacionesPorTipo['audiencia'] ?? 0)),
            ];
        });
    }

    /**
     * Estadísticas para Dashboard
     */
    public static function estadisticasDashboard(?int $clienteId = null): array
    {
        $baseQuery = Proceso::query();
        if ($clienteId) {
            $baseQuery->where('cliente_corporativo_id', $clienteId);
        }
        
        // Procesos por estado
        $porEstado = (clone $baseQuery)
            ->select('estado', DB::raw('count(*) as total'))
            ->groupBy('estado')
            ->pluck('total', 'estado')
            ->toArray();
        
        // Procesos por etapa
        $porEtapa = (clone $baseQuery)
            ->whereNotIn('estado', ['terminado', 'archivado'])
            ->select('etapa_procesal', DB::raw('count(*) as total'))
            ->groupBy('etapa_procesal')
            ->pluck('total', 'etapa_procesal')
            ->toArray();
        
        // Valores totales
        $valores = (clone $baseQuery)
            ->whereNotIn('estado', ['terminado', 'archivado'])
            ->select([
                DB::raw('SUM(cuantia_total) as total_capital'),
                DB::raw('SUM(cuantia_total) as total_cartera'),
                DB::raw('COUNT(*) as total_procesos'),
            ])
            ->first();
        
        // Actividad últimos 30 días
        $actividadMes = Actuacion::where('created_at', '>=', now()->subDays(30))
            ->select(DB::raw('DATE(fecha_actuacion) as fecha'), DB::raw('count(*) as total'))
            ->groupBy('fecha')
            ->orderBy('fecha')
            ->pluck('total', 'fecha')
            ->toArray();
        
        return [
            'por_estado' => $porEstado,
            'por_etapa' => $porEtapa,
            'total_capital' => $valores->total_capital ?? 0,
            'total_cartera' => $valores->total_cartera ?? 0,
            'total_procesos' => $valores->total_procesos ?? 0,
            'actividad_mes' => $actividadMes,
        ];
    }
}
