using OfficeOpenXml;
using OfficeOpenXml.Style;
using Services.Interfaces;

namespace Services.Services
{
    public class XLSXExport : IXLSXExport
    {
        public XLSXExport() { }

        public byte[] ExportExcel<T>(IEnumerable<T> datos)
        {
            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.LightGray);
                }

                // 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++;
                }

                // 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();
                }
            }
        }
    }
}
