using Application.Abstractions.Data;
using Application.Abstractions.Messaging;
using Microsoft.EntityFrameworkCore;
using SharedKernel.Results;
namespace Application.Features.Admin.Stocks.MarketHolidays.Add;
///
/// 휴장일 등록. 거래일을 휴장일로 잘못 등록하면 수집 배치가 그 날짜를 건너뛰어 데이터가 영구 결손되므로
/// 주말(불필요)·중복만 막고 나머지 검증은 운영자 판단에 맡긴다 (연 1회 KRX 휴장일 공시 기준 등록).
///
internal sealed class Handler(IAppDbContext db) : ICommandHandler
{
public async Task Handle(Command request, CancellationToken ct)
{
if (string.IsNullOrWhiteSpace(request.Name))
{
return Result.Failure(Error.Problem("MarketHoliday.NameRequired", "휴장일 명칭을 입력하세요."));
}
if (request.Date.DayOfWeek is DayOfWeek.Saturday or DayOfWeek.Sunday)
{
return Result.Failure(Error.Problem("MarketHoliday.Weekend", "주말(토·일)은 수집 배치가 자동 제외하므로 등록할 필요가 없습니다."));
}
if (await db.MarketHoliday.AsNoTracking().AnyAsync(c => c.Date == request.Date, ct))
{
return Result.Failure(Error.Conflict("MarketHoliday.Duplicate", $"{request.Date:yyyy-MM-dd} 은(는) 이미 등록된 휴장일입니다."));
}
db.MarketHoliday.Add(Domain.Entities.Stocks.MarketHoliday.Create(request.Date, request.Name));
await db.SaveChangesAsync(ct);
return Result.Success();
}
}