<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use Carbon\Carbon;

class DescargaMasivaController extends Controller
{
    /**
     * Descargar notas masivas en Excel
     * 
     * @param Request $request
     * @return \Symfony\Component\HttpFoundation\BinaryFileResponse
     */
    public function descargarNotasMasivas(Request $request)
    {
        try {
            Log::info('📥 Iniciando descarga masiva de notas', $request->all());

            $docenteId = $request->input('docente_id');
            $domainId = $request->input('domain_id');
            $cursoIds = $request->input('curso_ids', []);

            // Validar parámetros
            if (!$docenteId || !$domainId || empty($cursoIds)) {
                return response()->json([
                    'success' => false,
                    'message' => 'Parámetros incompletos'
                ], 400);
            }

            // Obtener notas de los cursos
            $notas = $this->obtenerNotasDeCursos($cursoIds, $domainId);

            if ($notas->isEmpty()) {
                return response()->json([
                    'success' => false,
                    'message' => 'No se encontraron notas para los cursos seleccionados'
                ], 404);
            }

            // Generar archivo Excel
            $archivo = $this->generarExcelNotas($notas, $cursoIds);

            Log::info('✅ Descarga masiva completada', [
                'total_notas' => $notas->count(),
                'cursos' => count($cursoIds)
            ]);

            return response()->download($archivo, basename($archivo))->deleteFileAfterSend(true);

        } catch (\Exception $e) {
            Log::error('❌ Error en descarga masiva: ' . $e->getMessage());
            
            return response()->json([
                'success' => false,
                'message' => 'Error interno del servidor',
                'error' => $e->getMessage()
            ], 500);
        }
    }

    /**
     * Obtener notas de los cursos especificados
     */
    private function obtenerNotasDeCursos($cursoIds, $domainId)
    {
        return DB::table('evaluaciones_alumno as ea')
            ->join('evaluaciones as e', 'ea.evaluacion_id', '=', 'e.id')
            ->join('grupo_de_evaluaciones as ge', 'e.grupo_de_evaluaciones_id', '=', 'ge.id')
            ->join('cursos as c', 'ge.curso_id', '=', 'c.id')
            ->join('alumnos as a', 'ea.alumno_id', '=', 'a.id')
            ->whereIn('c.id', $cursoIds)
            ->where('c.domain_id', $domainId)
            ->whereNull('c.deleted_at')
            ->whereNull('e.deleted_at')
            ->whereNull('ge.deleted_at')
            ->select(
                'a.dni',
                DB::raw("CONCAT(a.nombres, ' ', a.apellidos) as nombre_alumno"),
                'c.codigo as codigo_curso',
                'c.nombre as nombre_curso',
                'ge.nombre_del_grupo as grupo_evaluacion',
                'e.nombre as nombre_evaluacion',
                'e.porcentaje_asignado',
                'ea.nota',
                'ea.asistencia',
                'ea.created_at as fecha_registro'
            )
            ->orderBy('c.codigo')
            ->orderBy('a.apellidos')
            ->orderBy('a.nombres')
            ->get();
    }

    /**
     * Generar archivo Excel con las notas
     */
    private function generarExcelNotas($notas, $cursoIds)
    {
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setTitle('Notas');

        // ✅ Configurar headers
        $headers = [
            'DNI',
            'Alumno',
            'Código UD',
            'Unidad Didáctica',
            'Grupo Evaluación',
            'Evaluación',
            'Porcentaje',
            'Nota',
            'Asistencia',
            'Fecha Registro'
        ];

        // ✅ Establecer headers con estilo
        $col = 'A';
        foreach ($headers as $header) {
            $sheet->setCellValue($col . '1', $header);
            $sheet->getStyle($col . '1')->applyFromArray([
                'font' => [
                    'bold' => true,
                    'color' => ['rgb' => 'FFFFFF']
                ],
                'fill' => [
                    'fillType' => Fill::FILL_SOLID,
                    'startColor' => ['rgb' => '059669'] // Verde
                ],
                'alignment' => [
                    'horizontal' => Alignment::HORIZONTAL_CENTER,
                    'vertical' => Alignment::VERTICAL_CENTER
                ]
            ]);
            $col++;
        }

        // ✅ Llenar datos
        $row = 2;
        foreach ($notas as $nota) {
            $sheet->setCellValue('A' . $row, $nota->dni);
            $sheet->setCellValue('B' . $row, $nota->nombre_alumno);
            $sheet->setCellValue('C' . $row, $nota->codigo_curso);
            $sheet->setCellValue('D' . $row, $nota->nombre_curso);
            $sheet->setCellValue('E' . $row, $nota->grupo_evaluacion);
            $sheet->setCellValue('F' . $row, $nota->nombre_evaluacion);
            $sheet->setCellValue('G' . $row, $nota->porcentaje_asignado . '%');
            $sheet->setCellValue('H' . $row, $nota->nota);
            $sheet->setCellValue('I' . $row, $nota->asistencia ? 'Sí' : 'No');
            $sheet->setCellValue('J' . $row, Carbon::parse($nota->fecha_registro)->format('d/m/Y H:i'));

            // ✅ Colorear nota según valor
            if ($nota->nota >= 13) {
                $sheet->getStyle('H' . $row)->getFont()->getColor()->setRGB('059669'); // Verde
            } else {
                $sheet->getStyle('H' . $row)->getFont()->getColor()->setRGB('DC2626'); // Rojo
            }
            $sheet->getStyle('H' . $row)->getFont()->setBold(true);

            $row++;
        }

        // ✅ Ajustar anchos de columna
        $sheet->getColumnDimension('A')->setWidth(12); // DNI
        $sheet->getColumnDimension('B')->setWidth(30); // Alumno
        $sheet->getColumnDimension('C')->setWidth(15); // Código UD
        $sheet->getColumnDimension('D')->setWidth(35); // Unidad Didáctica
        $sheet->getColumnDimension('E')->setWidth(25); // Grupo
        $sheet->getColumnDimension('F')->setWidth(25); // Evaluación
        $sheet->getColumnDimension('G')->setWidth(12); // Porcentaje
        $sheet->getColumnDimension('H')->setWidth(10); // Nota
        $sheet->getColumnDimension('I')->setWidth(12); // Asistencia
        $sheet->getColumnDimension('J')->setWidth(18); // Fecha

        // ✅ Aplicar bordes a toda la tabla
        $lastRow = $row - 1;
        $sheet->getStyle('A1:J' . $lastRow)->applyFromArray([
            'borders' => [
                'allBorders' => [
                    'borderStyle' => Border::BORDER_THIN,
                    'color' => ['rgb' => 'CCCCCC']
                ]
            ]
        ]);

        // ✅ Guardar archivo temporal
        $filename = 'notas_masivas_' . implode('_', $cursoIds) . '_' . time() . '.xlsx';
        $filepath = storage_path('app/temp/' . $filename);

        // Crear directorio si no existe
        if (!file_exists(storage_path('app/temp'))) {
            mkdir(storage_path('app/temp'), 0755, true);
        }

        $writer = new Xlsx($spreadsheet);
        $writer->save($filepath);

        return $filepath;
    }
}