using Domain.Dtos.Stock;
using Domain.Entities;
using Domain.Generics;

namespace Models.Interfaces
{
    public interface IPhLSMProductRepository
    {
        /// <summary>
        /// Realiza una búsqueda paginada de productos según los parámetros provistos.
        /// </summary>
        /// <param name="searchParams">Parámetros de búsqueda y paginación.</param>
        /// <returns>Página de productos que cumplen con los filtros.</returns>
        Task<PagedResult<ELSProduct>> SearchAsync(LSProductSearchParams searchParams);

        /// <summary>
        /// Obtiene un producto por su identificador único.
        /// </summary>
        /// <param name="id">ID del producto.</param>
        /// <returns>Producto encontrado o null si no existe.</returns>
        Task<ELSProduct?> GetByIdAsync(int id);

        /// <summary>
        /// Inserta una lista de productos importados. Devuelve la cantidad de insertados y los omitidos/skipped.
        /// </summary>
        /// <param name="items">Lista de productos a importar (vista previa validada).</param>
        /// <returns>Resultado de la importación con cantidades y errores.</returns>
        Task<ProductImportResultDto> ImportProductsAsync(List<ProductImportPreviewDto> items);

        /// <summary>
        /// Crea un nuevo producto en la base de datos.
        /// </summary>
        /// <param name="entity">Entidad de producto a crear.</param>
        /// <returns>Producto creado.</returns>
        Task<ELSProduct> CreateAsync(ELSProduct entity);

        /// <summary>
        /// Actualiza un producto existente.
        /// </summary>
        /// <param name="entity">Entidad de producto con los datos actualizados.</param>
        /// <returns>True si la actualización fue exitosa.</returns>
        Task<bool> UpdateAsync(ELSProduct entity);

        /// <summary>
        /// Elimina un producto por su identificador único.
        /// </summary>
        /// <param name="id">ID del producto a eliminar.</param>
        /// <returns>True si la eliminación fue exitosa.</returns>
        Task<bool> DeleteAsync(int id);
    }
}

