/**
 * BrAPI 请求体日期/时间序列化：表单多为 YYYY-MM-DD，后端 OffsetDateTime 等字段需要 ISO-8601。
 */

const DATE_ONLY = /^(\d{4})-(\d{2})-(\d{2})$/;
const HAS_TIME_PART = /^\d{4}-\d{2}-\d{2}T/;
const HAS_TIMEZONE = /(Z|[+-]\d{2}:\d{2})$/i;

const isEmptyValue = (value: unknown) => {
  if (value === null || value === undefined) return true;
  const trimmed = String(value).trim();
  return !trimmed || trimmed === "__none__";
};

/**
 * ISO-8601 日期时间（UTC），用于 Study.startDate、Event 日期范围、imageTimeStamp 等 OffsetDateTime 字段。
 * 例：`2026-05-28` → `2026-05-28T00:00:00.000Z`
 */
export function toBrapiIsoDateTime(value: unknown): string | null {
  if (isEmptyValue(value)) return null;

  const trimmed = String(value).trim();

  if (HAS_TIME_PART.test(trimmed)) {
    if (HAS_TIMEZONE.test(trimmed)) return trimmed;
    return `${trimmed}Z`;
  }

  if (DATE_ONLY.test(trimmed)) {
    return `${trimmed}T00:00:00.000Z`;
  }

  const parsed = new Date(trimmed);
  if (!Number.isNaN(parsed.getTime())) {
    return parsed.toISOString();
  }

  return trimmed;
}

/**
 * ISO-8601 日期（仅日期部分），用于 Trial.startDate 等 LocalDate 字段。
 * 例：`2026-05-28T00:00:00Z` → `2026-05-28`
 */
export function toBrapiIsoDate(value: unknown): string | null {
  if (isEmptyValue(value)) return null;

  const trimmed = String(value).trim();

  if (DATE_ONLY.test(trimmed)) return trimmed;

  if (HAS_TIME_PART.test(trimmed)) {
    return trimmed.slice(0, 10);
  }

  const parsed = new Date(trimmed);
  if (!Number.isNaN(parsed.getTime())) {
    return parsed.toISOString().slice(0, 10);
  }

  return trimmed;
}
