using OfficeOpenXml;
using OfficeOpenXml.Table;

namespace Transversal.Services
{
    public class XLSXExportBase : IXLSXExportBase
    {
        public byte[] ExportExcel<T>(IEnumerable<T> datos)
        {
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (var package = new ExcelPackage())
            {
                var worksheet = package.Workbook.Worksheets.Add("datos");

                // Obtener las propiedades de T
                var propiedades = typeof(T).GetProperties();

                // Agregar estilo a la primera fila (encabezados)
                //using (var rng = worksheet.Cells[1, 1, 1, propiedades.Length])
                //{
                //    rng.Style.Font.Bold = true;
                //    rng.Style.Fill.PatternType = ExcelFillStyle.Solid;
                //    rng.Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightSteelBlue);
                //}

                // Agregar encabezados
                for (int i = 0; i < propiedades.Length; i++)
                {
                    worksheet.Cells[1, i + 1].Value = propiedades[i].Name;
                }

                // Agregar datos
                int row = 2;
                foreach (var item in datos)
                {
                    for (int i = 0; i < propiedades.Length; i++)
                    {
                        worksheet.Cells[row, i + 1].Value = propiedades[i].GetValue(item);
                    }

                    row++;
                }
                // Formato de tabla
                var tabla = worksheet.Tables.Add(new ExcelAddressBase(1, 1, row - 1, propiedades.Length), "Datos");
                tabla.TableStyle = TableStyles.Light13;

                // Ajuste automático de columnas
                worksheet.Cells[worksheet.Dimension.Address].AutoFitColumns();
                // Guardar el libro de trabajo en un MemoryStream
                using (var stream = new MemoryStream())
                {
                    package.SaveAs(stream);
                    stream.Position = 0;

                    // Devolver el archivo como un array de bytes
                    return package.GetAsByteArray();
                }
            }
        }
    }
}