<?php

namespace App\Exports;

use App\Models\Producto;
use App\Models\Categoria;
use Maatwebsite\Excel\Concerns\WithMultipleSheets;

class ProductosExport implements WithMultipleSheets
{
    /**
     * Retorna las hojas del Excel
     */
    public function sheets(): array
    {
        return [
            new ProductosSheet(),
            new CategoriasReferenciaSheet(),
        ];
    }
}

/**
 * Hoja de productos
 */
class ProductosSheet implements 
    \Maatwebsite\Excel\Concerns\FromCollection,
    \Maatwebsite\Excel\Concerns\WithHeadings,
    \Maatwebsite\Excel\Concerns\WithMapping,
    \Maatwebsite\Excel\Concerns\WithStyles,
    \Maatwebsite\Excel\Concerns\ShouldAutoSize,
    \Maatwebsite\Excel\Concerns\WithTitle
{
    /**
     * Retorna la colección de productos a exportar
     */
    public function collection()
    {
        return Producto::with('categoria')->get();
    }

    /**
     * Define los encabezados del Excel
     */
    public function headings(): array
    {
        return [
            'ID',
            'Nombre',
            'Descripcion',
            'Codigo_de_Barras',
            'Categoria',
            'Precio_Compra',
            'Precio_Venta',
            'Stock',
            'Stock_Minimo',
            'Stock_Maximo',
            'Unidad_de_Medida',
            'Estado',
        ];
    }

    /**
     * Mapea cada producto a una fila del Excel
     */
    public function map($producto): array
    {
        return [
            $producto->id,
            $producto->nombre,
            $producto->descripcion,
            $producto->codigo_barras,
            $producto->categoria?->nombre ?? '',
            $producto->precio_compra,
            $producto->precio_venta,
            $producto->getStockEfectivo(),
            $producto->stock_minimo,
            $producto->stock_maximo,
            $producto->unidad_medida ?? 'unidad',
            $producto->estado ? 'Activo' : 'Inactivo',
        ];
    }

    /**
     * Aplica estilos al Excel
     */
    public function styles(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $sheet)
    {
        return [
            // Estilo para la fila de encabezados
            1 => [
                'font' => ['bold' => true],
                'fill' => [
                    'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
                    'startColor' => ['rgb' => '4F46E5']
                ],
                'font' => [
                    'bold' => true,
                    'color' => ['rgb' => 'FFFFFF']
                ]
            ],
        ];
    }

    /**
     * Título de la hoja
     */
    public function title(): string
    {
        return 'Productos';
    }
}

/**
 * Hoja de referencia de categorías
 */
class CategoriasReferenciaSheet implements 
    \Maatwebsite\Excel\Concerns\FromCollection,
    \Maatwebsite\Excel\Concerns\WithHeadings,
    \Maatwebsite\Excel\Concerns\WithMapping,
    \Maatwebsite\Excel\Concerns\WithStyles,
    \Maatwebsite\Excel\Concerns\ShouldAutoSize,
    \Maatwebsite\Excel\Concerns\WithTitle
{
    /**
     * Retorna la colección de categorías
     */
    public function collection()
    {
        return Categoria::all();
    }

    /**
     * Define los encabezados
     */
    public function headings(): array
    {
        return [
            'ID',
            'Nombre_de_Categoria',
            'Descripcion',
        ];
    }

    /**
     * Mapea cada categoría a una fila
     */
    public function map($categoria): array
    {
        return [
            $categoria->id,
            $categoria->nombre,
            'Usa este nombre en la columna "Categoria" de la hoja Productos',
        ];
    }

    /**
     * Aplica estilos
     */
    public function styles(\PhpOffice\PhpSpreadsheet\Worksheet\Worksheet $sheet)
    {
        return [
            1 => [
                'font' => ['bold' => true],
                'fill' => [
                    'fillType' => \PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID,
                    'startColor' => ['rgb' => '10B981']
                ],
                'font' => [
                    'bold' => true,
                    'color' => ['rgb' => 'FFFFFF']
                ]
            ],
        ];
    }

    /**
     * Título de la hoja
     */
    public function title(): string
    {
        return 'Categorías Disponibles';
    }
}
