/**
 * シルギア 日の出・日の入りAPI v1 の型定義
 * https://api.shirugear.com/sun/
 *
 * 互換の方針: v1 の中では項目を「足す」ことはあっても、名前や意味は変えません。
 * 知らない項目が増えていても無視してください。
 *
 * 日付は "YYYY-MM-DD"、時刻は日本時間の "HH:MM"（24時間制・0埋め。秒を四捨五入した分）。
 * 時刻はすべてその日（日本時間の0時から24時まで）の中の時刻です。日付をまたいで前の日・次の日の時刻が入ることはありません。
 * 日付は丸める前の時刻で決めるので、23時59分30秒以降の月の出入り・南中は、その日の "24:00" になります（国立天文台の表と同じ）。
 */

/** 時刻（日本時間 "HH:MM"。"00:00"〜"23:59"） */
export type Hm = string;

/** 月の時刻（日本時間 "HH:MM"。"00:00"〜"24:00"。23時59分30秒以降は "24:00"） */
export type MoonHm = string;

/** 計算の地点（国立天文台「各地のこよみ」と同じ地点・経緯度。標高 0m） */
export interface SunPoint {
  /** 地点の名前（例: "東京"・"札幌"・"那覇"） */
  name: string;
  /** 緯度（度。北緯がプラス） */
  lat: number;
  /** 経度（度。東経がプラス） */
  lon: number;
  /** 標高（m）。いつも 0 */
  elevation: number;
}

/** GET /sun/v1/{pref}/{year}.json の days の1件（1日分） */
export interface SunDay {
  /** "YYYY-MM-DD" */
  date: string;
  /** 日の出（太陽の上辺が地平線に接する時刻）。日本ではいつもある */
  sunrise: Hm;
  /** 太陽の南中（真南に来る時刻） */
  sun_transit: Hm;
  /** 日の入り（太陽の上辺が地平線に接する時刻） */
  sunset: Hm;
  /** 南中のときの太陽の高度（度・小数1桁。大気差を含む見かけの高度） */
  sun_altitude: number;
  /** 昼の長さ "HH:MM"（sunset − sunrise。どちらも分に丸めた値の差） */
  day_length: string;
  /** 月の出（月の中心が地平線に接する時刻）。その日に無ければ null（月に1回前後ある） */
  moonrise: MoonHm | null;
  /** 月の南中。その日に無ければ null */
  moon_transit: MoonHm | null;
  /** 月の入り（月の中心が地平線に接する時刻）。その日に無ければ null */
  moonset: MoonHm | null;
}

/** GET /sun/v1/{pref}/{year}.json（pref は "01"〜"47"、year は 2000〜2100） */
export interface SunYearResponse {
  /** 都道府県コード（"01"〜"47"。JIS X 0401） */
  pref: string;
  /** 都道府県の名前（例: "東京都"） */
  pref_name: string;
  point: SunPoint;
  year: number;
  /** 1月1日〜12月31日の毎日（365件。うるう年は366件）。日付の順 */
  days: SunDay[];
  /** データの版（元データが変わった日 "YYYY-MM-DD"。祝日・営業日API・暦APIと共通） */
  data_version: string;
}

/** GET /sun/v1/meta.json */
export interface SunMetaResponse {
  /** データの版 "YYYY-MM-DD" */
  data_version: string;
  /** データを作った日時（ISO 8601・UTC） */
  built_at: string;
  /** 最初の年（2000） */
  from: number;
  /** 最後の年（2100） */
  to: number;
  sources: {
    /** 天文計算のもと（例: "JPL DE440s / skyfield 1.55"） */
    astronomy: string;
  };
  /** 定義（説明文。言い回しは変わることがある） */
  definitions: {
    timezone: string;
    sunrise_sunset: string;
    moonrise_moonset: string;
    transit: string;
    /** 大気差（"35'08\""） */
    refraction: string;
    /** 標高（0） */
    elevation_m: number;
    minutes: string;
    day_length: string;
  };
  /** 47地点（都道府県コードの順） */
  points: Array<SunPoint & { pref: string; pref_name: string }>;
  counts: {
    /** 地点の数（47） */
    points: number;
    /** 年の数（101） */
    years: number;
    /** 全地点・全期間の日数の合計 */
    days: number;
  };
}

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