<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromArray;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithStyles;
use Maatwebsite\Excel\Concerns\WithTitle;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;
use PhpOffice\PhpSpreadsheet\Style\Font;

class UnidadesDidacticasExport implements FromArray, WithHeadings, WithStyles, WithTitle, ShouldAutoSize, WithEvents
{
    protected $datos;  // Array de estudiantes/datos

    public function __construct($datos)
    {
        $this->datos = $datos;  // Ej: $reporte->alumnos adaptado
    }

    public function array(): array
    {
        $array = [];
        $n = 1;  // Contador para N°

        foreach ($this->datos as $estudiante) {
            $array[] = [
                $n++,  // N°
                $estudiante->dni ?? '',  // Número de documento
                $estudiante->nombre ?? '',  // Apellidos y nombres
                ...$estudiante->unidades ?? [0, 0, 0, 0, 0, 0],  // Valores de las 6 unidades (expande con spread operator)
                '',  // Espacio para "Experiencias Formativas" (mergeado en header)
                $estudiante->aprobadas ?? 0,  // Aprobadas
                $estudiante->desaprobadas ?? 0,  // Desaprobadas
                $estudiante->creditos ?? 0,  // Créditos
            ];
        }

        return $array;
    }

    public function headings(): array
    {
        return [
            // Fila 1: Título principal (mergeado si quieres, pero lo manejamos en events)
            ['UNIDADES DIDÁCTICAS', '', '', 'OBSERVACIONES'],  // Merge en events

            // Fila 2: Subheaders de unidades y créditos
            ['N°', 'Número de documento de identidad', 'APELLIDOS Y NOMBRES (En orden alfabético)', '', '', '', '', '', '', '', '', '', '', '', '', 'EXPERIENCIAS FORMATIVAS EN SITUACIONES REALES DE TRABAJO', '', '', ''],

            // Fila 3: Créditos (solo para unidades)
            ['', '', '', '3.0', '5.0', '4.0', '2.0', '2.0', '4.0', '', '', '', '', '', '', '', '', '', ''],

            // Fila 4: Nombres de columnas (unidades)
            ['', '', '', 'Administración de los recursos TI', 'Algoritmos y estructura de datos', 'Análisis y diseño de sistemas', 'Aplicaciones en internet', 'Comportamiento ético', 'Didáctica en el uso de Recursos Informáticos', '', '', '', '', '', '', 'NÚMERO DE UNIDADES DIDÁCTICAS APROBADAS', 'DESAPROBADAS', 'CRÉDITOS'],
        ];
    }

    public function title(): string
    {
        return 'Reporte Unidades Didácticas';  // Nombre de la hoja
    }

    public function styles(Worksheet $sheet)
    {
        // Estilos generales
        return [
            // Fila de headers: Negrita, centrado, fondo gris claro
            1 => ['font' => ['bold' => true], 'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'D3D3D3']]],
            2 => ['font' => ['bold' => true], 'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'D3D3D3']]],
            3 => ['font' => ['bold' => true], 'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'F0F8FF']]],
            4 => ['font' => ['bold' => true], 'alignment' => ['horizontal' => Alignment::HORIZONTAL_CENTER], 'fill' => ['fillType' => Fill::FILL_SOLID, 'startColor' => ['rgb' => 'D3D3D3']]],
        ];
    }

    public function registerEvents(): array
    {
        return [
            AfterSheet::class => function (AfterSheet $event) {
                $sheet = $event->sheet->getDelegate();

                // Merge cells para headers (ej: A1:D1 para "UNIDADES DIDÁCTICAS")
                $sheet->mergeCells('A1:D1');  // Ajusta rangos según tus columnas
                $sheet->mergeCells('J1:P1');  // Para "OBSERVACIONES" o similar
                $sheet->mergeCells('Q4:S4');  // Para la sección de Experiencias

                // Bordes para toda la tabla
                $sheet->getStyle('A1:S' . ($this->datos->count() + 4))->applyFromArray([
                    'borders' => [
                        'allBorders' => [
                            'borderStyle' => Border::BORDER_THIN,
                            'color' => ['rgb' => '000000'],
                        ],
                    ],
                ]);

                // Alineación central para números y textos
                $sheet->getStyle('A4:S' . ($this->datos->count() + 4))->getAlignment()->setHorizontal(Alignment::HORIZONTAL_CENTER);
            },
        ];
    }
}