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(); var sql = @" SELECT * FROM CategoryPricing WHERE CategoryId = @Id; SELECT * FROM WordPricingRanges WHERE CategoryPricingId = (SELECT Id FROM CategoryPricing WHERE CategoryId = @Id) ORDER BY FromCount;"; using var multi = await conn.QueryMultipleAsync(sql, new { Id = categoryId }); var pricing = await multi.ReadSingleOrDefaultAsync(); if (pricing != null) { pricing.WordRanges = (await multi.ReadAsync()).ToList(); } return pricing; } public async Task UpsertPricingAsync(CategoryPricing pricing) { using var conn = _db.CreateConnection(); var exists = await conn.QuerySingleOrDefaultAsync( "SELECT Id FROM CategoryPricing WHERE CategoryId = @CategoryId", new { pricing.CategoryId }); if (exists != null) { pricing.Id = exists.Id; var updateSql = @" UPDATE CategoryPricing SET BaseWordCount = @BaseWordCount, ExtraWordPrice = @ExtraWordPrice, SpecialChars = @SpecialChars, SpecialCharPrice = @SpecialCharPrice, BoldSurcharge = @BoldSurcharge, FrameSurcharge = @FrameSurcharge WHERE Id = @Id"; 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); SELECT CAST(SCOPE_IDENTITY() as int);"; pricing.Id = await conn.QuerySingleAsync(insertSql, pricing); } // Gestionar Rangos de Palabras await conn.ExecuteAsync("DELETE FROM WordPricingRanges WHERE CategoryPricingId = @Id", new { Id = pricing.Id }); if (pricing.WordRanges != null && pricing.WordRanges.Any()) { foreach (var range in pricing.WordRanges) { range.CategoryPricingId = pricing.Id; } var rangeSql = "INSERT INTO WordPricingRanges (CategoryPricingId, FromCount, ToCount, PricePerWord) VALUES (@CategoryPricingId, @FromCount, @ToCount, @PricePerWord)"; await conn.ExecuteAsync(rangeSql, pricing.WordRanges); } } 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 }); } }