using System.ComponentModel.DataAnnotations;
namespace Domain.Entities.Stocks;
///
/// SEIBro 권리기준일 (getStddtInfo) — 발행회사별 권리 발생 기준일·사유 (Wave 1).
/// 자연키 UNIQUE (IssucoCustno, RgtStdDt, RgtRacd, RgtRsnDetailSortCd).
/// Wave 3(총회·상호변경·단주 등)의 이벤트 발견 소스 — RGT_RACD 로 후속 기업행위 API 호출 대상을 판별한다.
/// (예: 001/002/003/009 → 총회, 204 → 상호변경)
///
public class RightsBaseDate
{
[Key]
public int ID { get; private set; }
/// 발행회사 고객번호 (ISSUCO_CUSTNO)
public int IssucoCustno { get; private set; }
/// 대표종목명 (REP_SECN_NM)
public string RepSecnNm { get; private set; } = default!;
/// 권리기준일자 (RGT_STD_DT)
public DateOnly RgtStdDt { get; private set; }
/// 권리사유코드 (RGT_RACD) — 001정기총회 … 907이익소각
public string RgtRacd { get; private set; } = default!;
/// 권리사유명 (RGT_RACD_NM)
public string? RgtRacdNm { get; private set; }
/// 권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD)
public string RgtRsnDetailSortCd { get; private set; } = default!;
public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
private RightsBaseDate() { }
public static RightsBaseDate Create(
int issucoCustno,
string repSecnNm,
DateOnly rgtStdDt,
string rgtRacd,
string? rgtRacdNm,
string rgtRsnDetailSortCd)
{
if (string.IsNullOrWhiteSpace(repSecnNm))
{
throw new ArgumentException("repSecnNm required", nameof(repSecnNm));
}
if (string.IsNullOrWhiteSpace(rgtRacd))
{
throw new ArgumentException("rgtRacd required", nameof(rgtRacd));
}
if (string.IsNullOrWhiteSpace(rgtRsnDetailSortCd))
{
throw new ArgumentException("rgtRsnDetailSortCd required", nameof(rgtRsnDetailSortCd));
}
return new RightsBaseDate
{
IssucoCustno = issucoCustno,
RepSecnNm = repSecnNm.Trim(),
RgtStdDt = rgtStdDt,
RgtRacd = rgtRacd.Trim(),
RgtRacdNm = string.IsNullOrWhiteSpace(rgtRacdNm) ? null : rgtRacdNm.Trim(),
RgtRsnDetailSortCd = rgtRsnDetailSortCd.Trim()
};
}
/// 재수집 반영 — 이름/사유명 변경 시에만 UpdatedAt 갱신 (자연키는 불변)
public void Update(string repSecnNm, string? rgtRacdNm)
{
var changed = false;
if (!string.IsNullOrWhiteSpace(repSecnNm) && RepSecnNm != repSecnNm.Trim())
{
RepSecnNm = repSecnNm.Trim();
changed = true;
}
var normalizedRacdNm = string.IsNullOrWhiteSpace(rgtRacdNm) ? null : rgtRacdNm.Trim();
if (RgtRacdNm != normalizedRacdNm)
{
RgtRacdNm = normalizedRacdNm;
changed = true;
}
if (changed)
{
UpdatedAt = DateTime.UtcNow;
}
}
}