using System;

namespace Hc900Crawler.Core.Application.Services;

/// <summary>
/// 시간 범위 레코드
/// KST 기준 시간으로 저장되고, SQL 조건 생성 시 UTC로 변환됩니다.
/// </summary>
public record TimeRange(
    string?         PostgresInterval,  // 상대: '3 hours'
    DateTime?       KstFrom,           // KST 기준 시작
    DateTime?       KstTo              // KST 기준 끝
)
{
    /// <summary>
    /// PostgreSQL WHERE 절 스니펫 생성
    /// </summary>
    /// <param name="col">타임스탬프 컬럼명</param>
    /// <param name="kst">KST 변환기 (절대 시간인 경우만 필요)</param>
    public string ToSqlCondition(string col, KstClock kst)
    {
        // 상대 범위: NOW() 기반 — KST 변환 불필요
        if (PostgresInterval is not null)
            return KstClock.ToIntervalCondition(col, PostgresInterval);

        // 절대 범위: KST → UTC 변환 후 리터럴 생성
        var fromSql = KstFrom.HasValue ? kst.ToSqlLiteral(KstFrom.Value) : null;
        var toSql   = KstTo.HasValue   ? kst.ToSqlLiteral(KstTo.Value)   : null;

        return (fromSql, toSql) switch
        {
            (not null, not null) => $"{col} >= {fromSql} AND {col} < {toSql}",
            (not null, null)     => $"{col} >= {fromSql}",
            (null, not null)     => $"{col} < {toSql}",
            _                   => KstClock.ToIntervalCondition(col, "1 hour")
        };
    }
}
