export function formatDateTime(raw: unknown): string {
  const d = toDate(raw)
  if (!d) return "-"
  const Y = d.getFullYear()
  const M = String(d.getMonth() + 1).padStart(2, "0")
  const D = String(d.getDate()).padStart(2, "0")
  const h = String(d.getHours()).padStart(2, "0")
  const m = String(d.getMinutes()).padStart(2, "0")
  return `${Y}-${M}-${D} ${h}:${m}`
}

export function formatDate(raw: unknown): string {
  const d = toDate(raw)
  if (!d) return "-"
  return d.toLocaleDateString()
}

function toDate(raw: unknown): Date | null {
  if (raw == null) return null

  if (raw instanceof Date) return isNaN(raw.getTime()) ? null : raw

  if (typeof raw === "string") {
    const d = new Date(raw)
    return isNaN(d.getTime()) ? null : d
  }

  if (typeof raw === "number") {
    const d = new Date(raw)
    return isNaN(d.getTime()) ? null : d
  }

  // Java LocalDateTime array: [year, month, day, hour, minute, second, nanos]
  if (Array.isArray(raw) && raw.length >= 3) {
    const [y, mo, d, h = 0, mi = 0, s = 0] = raw
    return new Date(Number(y), Number(mo) - 1, Number(d), Number(h), Number(mi), Number(s))
  }

  if (typeof raw === "object") {
    const obj = raw as Record<string, unknown>
    const y = Number(obj.year ?? 0)
    const mo = Number(obj.monthValue ?? obj.month ?? 1)
    const d = Number(obj.dayOfMonth ?? obj.day ?? 1)
    const h = Number(obj.hour ?? 0)
    const mi = Number(obj.minute ?? 0)
    const s = Number(obj.second ?? 0)
    if (!isNaN(y) && !isNaN(mo) && !isNaN(d)) {
      return new Date(y, mo - 1, d, h, mi, s)
    }
  }

  return null
}
