/**
 * シルギア 暦API v1 の型定義
 * https://api.shirugear.com/koyomi/
 *
 * 互換の方針: v1 の中では項目を「足す」ことはあっても、名前や意味は変えません。
 * 知らない項目が増えていても無視してください。
 *
 * 日付は "YYYY-MM-DD"、時刻は日本時間の "YYYY-MM-DDTHH:MM:SS+09:00"（ISO 8601・秒まで）。
 * 六曜・干支などの暦注は迷信・慣習としての参考情報で、科学的な根拠を示すものではありません。
 */

/** 曜日 */
export type Weekday = "日" | "月" | "火" | "水" | "木" | "金" | "土";

/** 六曜。（旧暦の月 + 旧暦の日）を 6 で割った余りが 0 大安・1 赤口・2 先勝・3 友引・4 先負・5 仏滅 */
export type Rokuyo = "先勝" | "友引" | "先負" | "仏滅" | "大安" | "赤口";

/** 二十四節気の名前 */
export type SekkiName =
  | "小寒" | "大寒" | "立春" | "雨水" | "啓蟄" | "春分"
  | "清明" | "穀雨" | "立夏" | "小満" | "芒種" | "夏至"
  | "小暑" | "大暑" | "立秋" | "処暑" | "白露" | "秋分"
  | "寒露" | "霜降" | "立冬" | "小雪" | "大雪" | "冬至";

/** 雑節の名前（社日は含まない） */
export type ZassetsuName =
  | "節分" | "彼岸入り" | "彼岸明け" | "八十八夜" | "入梅" | "半夏生"
  | "二百十日" | "二百二十日" | "土用入り" | "土用の丑の日";

/** 月の満ち欠け（月と太陽の地心黄経の差が 0°・90°・180°・270° になる瞬間） */
export type MoonPhaseName = "新月" | "上弦" | "満月" | "下弦";

/** 旧暦の日付（天保暦の決め方。新月の日を1日とし、冬至を含む月を11月とする） */
export interface LunarDate {
  /** 旧暦の年。旧暦の1月1日（閏でない）がある西暦の年。旧正月より前の日は前の年 */
  year: number;
  /** 旧暦の月（1〜12）。閏月も同じ番号（閏11月なら 11） */
  month: number;
  /** 旧暦の日（1〜30） */
  day: number;
  /** 閏月なら true（例: 2033-12-22 からは閏11月） */
  leap: boolean;
  /** 表示用。"1月1日" / "閏11月1日" */
  text: string;
}

/** GET /koyomi/v1/{year}.json の days の1件（1日分） */
export interface KoyomiDay {
  /** "YYYY-MM-DD" */
  date: string;
  weekday: Weekday;
  /** その日の和暦の年（"令和8年"・"平成元年" など）。未来の日付も今の元号のまま数える */
  wareki: string;
  lunar: LunarDate;
  rokuyo: Rokuyo;
  /** 日の干支（60日周期。1900-01-01 が "甲戌"） */
  kanshi: string;
  /** 日の干支の読み（ひらがな。例: "みずのえいぬ"） */
  kanshi_kana: string;
  /** その日に入る二十四節気。無ければ null */
  sekki: SekkiName | null;
  /** その日の雑節の表示用の名前（年の zassetsu の label。例: "夏の土用の丑の日"）。無ければ [] */
  zassetsu: string[];
  /** 月齢。その日の正午（日本時間）の、直前の新月からの経過日数（小数1桁に四捨五入。0.0〜29.9） */
  moon_age: number;
  /** その日（日本時間）に新月・上弦・満月・下弦の瞬間があればその名前。無ければ null */
  moon_phase: MoonPhaseName | null;
}

/** 二十四節気（年の一覧の1件） */
export interface SolarTerm {
  name: SekkiName;
  /** 読み（ひらがな） */
  kana: string;
  /** 太陽の地心視黄経（度。0〜345 の 15 の倍数。30 の倍数が中気） */
  longitude: number;
  /** その瞬間がある日（日本時間） */
  date: string;
  /** その瞬間の時刻（日本時間・秒まで） */
  at: string;
}

/** 雑節（年の一覧の1件） */
export interface Zassetsu {
  name: ZassetsuName;
  /** 季節のある雑節（彼岸・土用）だけ。無い雑節では項目ごと無い */
  season?: "春" | "夏" | "秋" | "冬";
  /** 表示用の名前（"夏の土用入り" / "彼岸入り（春）" など。季節の無い雑節は name と同じ） */
  label: string;
  date: string;
  /** 太陽の黄経で決まる雑節（入梅 80°・半夏生 100°・土用入り 297/27/117/207°）だけ。ほかは項目ごと無い */
  at?: string;
}

/** 月の満ち欠け（年の一覧の1件） */
export interface MoonPhase {
  name: MoonPhaseName;
  date: string;
  /** 日本時間・秒まで */
  at: string;
}

/** GET /koyomi/v1/{year}.json（year は 1900〜2100） */
export interface KoyomiYearResponse {
  year: number;
  /** 和暦の年。年の途中で元号が変わる年は "昭和64年・平成元年" のように「・」でつなぐ */
  wareki: string;
  /** 年の干支（西暦の年で決め、1月1日で切り替える。例: 2026 → "丙午"） */
  kanshi: string;
  /** 年の干支の読み（例: "ひのえうま"） */
  kanshi_kana: string;
  /** 1月1日〜12月31日の毎日（365件。うるう年は366件）。日付の順 */
  days: KoyomiDay[];
  /** その年の二十四節気（24件・日付の順） */
  solar_terms: SolarTerm[];
  /** その年の雑節（日付の順） */
  zassetsu: Zassetsu[];
  /** その年の新月・上弦・満月・下弦（日付の順） */
  moon_phases: MoonPhase[];
  /** データの版（元データが変わった日 "YYYY-MM-DD"。祝日・営業日APIと共通） */
  data_version: string;
}

/** GET /koyomi/v1/meta.json */
export interface KoyomiMetaResponse {
  /** データの版 "YYYY-MM-DD" */
  data_version: string;
  /** データを作った日時（ISO 8601・UTC） */
  built_at: string;
  /** 最初の年（1900） */
  from: number;
  /** 最後の年（2100） */
  to: number;
  sources: {
    /** 天文計算のもと（例: "JPL DE440s / skyfield 1.55"） */
    astronomy: string;
  };
  counts: {
    /** 全期間の日数 */
    days: number;
  };
}

/** エラーのときの本文 */
export interface ErrorResponse {
  error: {
    status: 400 | 404 | 405;
    code: "invalid_year" | "year_not_found" | "not_found" | "method_not_allowed";
    message: string;
  };
}
