using Dapper; using SIGCM.Domain.Entities; using SIGCM.Infrastructure.Data; namespace SIGCM.Infrastructure.Repositories; public class PricingRepository { private readonly IDbConnectionFactory _db; public PricingRepository(IDbConnectionFactory db) { _db = db; } public async Task GetByCategoryIdAsync(int categoryId) { using var conn = _db.CreateConnection(); return await conn.QuerySingleOrDefaultAsync( "SELECT * FROM CategoryPricing WHERE CategoryId = @Id", new { Id = categoryId }); } public async Task UpsertPricingAsync(CategoryPricing pricing) { using var conn = _db.CreateConnection(); // Lógica de "Si existe actualiza, sino inserta" var exists = await conn.ExecuteScalarAsync( "SELECT COUNT(1) FROM CategoryPricing WHERE CategoryId = @CategoryId", new { pricing.CategoryId }); if (exists > 0) { var updateSql = @" UPDATE CategoryPricing SET BaseWordCount = @BaseWordCount, ExtraWordPrice = @ExtraWordPrice, SpecialChars = @SpecialChars, SpecialCharPrice = @SpecialCharPrice, BoldSurcharge = @BoldSurcharge, FrameSurcharge = @FrameSurcharge WHERE CategoryId = @CategoryId"; await conn.ExecuteAsync(updateSql, pricing); } else { var insertSql = @" INSERT INTO CategoryPricing (CategoryId, BaseWordCount, ExtraWordPrice, SpecialChars, SpecialCharPrice, BoldSurcharge, FrameSurcharge) VALUES (@CategoryId, @BaseWordCount, @ExtraWordPrice, @SpecialChars, @SpecialCharPrice, @BoldSurcharge, @FrameSurcharge)"; await conn.ExecuteAsync(insertSql, pricing); } } public async Task> GetActivePromotionsAsync() { using var conn = _db.CreateConnection(); return await conn.QueryAsync( "SELECT * FROM Promotions WHERE IsActive = 1"); } // --- SECCIÓN PROMOCIONES --- public async Task> GetAllPromotionsAsync() { using var conn = _db.CreateConnection(); return await conn.QueryAsync("SELECT * FROM Promotions ORDER BY Id DESC"); } public async Task CreatePromotionAsync(Promotion promo) { using var conn = _db.CreateConnection(); var sql = @" INSERT INTO Promotions (Name, CategoryId, MinDays, DaysOfWeek, DiscountPercentage, DiscountFixedAmount, IsActive) VALUES (@Name, @CategoryId, @MinDays, @DaysOfWeek, @DiscountPercentage, @DiscountFixedAmount, @IsActive); SELECT CAST(SCOPE_IDENTITY() as int);"; return await conn.QuerySingleAsync(sql, promo); } public async Task UpdatePromotionAsync(Promotion promo) { using var conn = _db.CreateConnection(); var sql = @" UPDATE Promotions SET Name = @Name, CategoryId = @CategoryId, MinDays = @MinDays, DaysOfWeek = @DaysOfWeek, DiscountPercentage = @DiscountPercentage, DiscountFixedAmount = @DiscountFixedAmount, IsActive = @IsActive WHERE Id = @Id"; await conn.ExecuteAsync(sql, promo); } public async Task DeletePromotionAsync(int id) { using var conn = _db.CreateConnection(); await conn.ExecuteAsync("DELETE FROM Promotions WHERE Id = @Id", new { Id = id }); } }