using System.ComponentModel.DataAnnotations;
namespace Domain.Entities.Store;
/// 게임 장르 코드 (관리형). 게임과 N:M (GameGenreMap).
public class GameGenre
{
[Key]
public int ID { get; private set; }
public string KorName { get; private set; } = default!;
public string? EngName { get; private set; }
public int Order { get; private set; }
public bool IsActive { get; private set; } = true;
public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
public DateTime? UpdatedAt { get; private set; }
public virtual List GameGenreMap { get; private set; } = [];
private GameGenre() { }
public static GameGenre Create(string korName, string? engName = null, int order = 0, bool isActive = true)
{
Validate(korName, engName);
return new GameGenre
{
KorName = korName.Trim(),
EngName = string.IsNullOrWhiteSpace(engName) ? null : engName.Trim(),
Order = order,
IsActive = isActive
};
}
public void Update(string korName, string? engName, int order, bool isActive)
{
Validate(korName, engName);
KorName = korName.Trim();
EngName = string.IsNullOrWhiteSpace(engName) ? null : engName.Trim();
Order = order;
IsActive = isActive;
UpdatedAt = DateTime.UtcNow;
}
private static void Validate(string korName, string? engName)
{
if (string.IsNullOrWhiteSpace(korName))
{
throw new ArgumentException("KorName is required.", nameof(korName));
}
if (korName.Length > 100)
{
throw new ArgumentOutOfRangeException(nameof(korName), "KorName 은 100자 이하로 입력하세요.");
}
if (engName is not null && engName.Length > 100)
{
throw new ArgumentOutOfRangeException(nameof(engName), "EngName 은 100자 이하로 입력하세요.");
}
}
}