// ============================================================================
//  PLAYBOOK DATA — SAKURAMA TATSUYA (M1x / NTT東日本 / SENIOR JPN)
//  Source: JARA 発第2025-365号（2026年3月19日）
//  Strategy: DOUBLE PEAK — P1 World Championships / P2 Asian Games
// ============================================================================

const PHASES = [
  { id: "block2", label: "5月強化合宿", labelEn: "BLOCK 2 — MAY CAMP", emoji: "🚣", kind: "natl",
    start: "2026-05-20", end: "2026-05-28", days: 9, weight: 9,
    desc: "WC1直前。Z1多め＋スタート練習。" },
  { id: "wc1", label: "WC1 セビリア", labelEn: "WORLD ROWING CUP I", emoji: "🇪🇸", kind: "race-int",
    start: "2026-05-29", end: "2026-05-31", days: 3, weight: 3, marker: "▲",
    desc: "シーズン初戦。世界の現在地を確認する。" },
  { id: "post-wc1", label: "WC1後・帰国", labelEn: "POST WC1 RETURN", emoji: "✈️", kind: "travel",
    start: "2026-06-01", end: "2026-06-07", days: 7, weight: 7,
    desc: "時差調整＋低強度メンテ。全日本選手権期間。" },
  { id: "wc3-camp", label: "WC3向け強化", labelEn: "BLOCK 3 — TO WC3", emoji: "🏋️", kind: "natl",
    start: "2026-06-08", end: "2026-06-25", days: 18, weight: 18,
    desc: "Z3 × 週3＋Z2 × 週2＋ウェイト3。SBSの貯金を伸ばす。" },
  { id: "wc3", label: "WC3 ルツェルン", labelEn: "WORLD ROWING CUP III", emoji: "🇨🇭", kind: "race-int",
    start: "2026-06-26", end: "2026-06-28", days: 3, weight: 3, marker: "▲",
    desc: "WCH選考の最終評価レース。" },
  { id: "summer1", label: "夏期強化①", labelEn: "SUMMER BLOCK 1", emoji: "🏋️", kind: "natl",
    start: "2026-06-29", end: "2026-07-26", days: 28, weight: 28,
    desc: "WCH選考確定後、本ピーク作りの土台。" },
  { id: "summer2", label: "夏期強化②", labelEn: "SUMMER BLOCK 2", emoji: "🏋️", kind: "natl",
    start: "2026-07-27", end: "2026-08-15", days: 20, weight: 20,
    desc: "高強度ピーキング。Z3メイン。" },
  { id: "ned-camp", label: "蘭事前合宿", labelEn: "NETHERLANDS CAMP", emoji: "🇳🇱", kind: "travel",
    start: "2026-08-16", end: "2026-08-22", days: 7, weight: 7,
    desc: "アムステルダム水域順応。時差ぼけ最少化。" },
  { id: "wch", label: "世界選手権", labelEn: "WORLD CHAMPIONSHIPS", emoji: "⭐", kind: "race-int",
    start: "2026-08-23", end: "2026-08-30", days: 8, weight: 8, peak: 1, marker: "★",
    desc: "★ P1 — FULL PEAK。年間で最も大事な8日間。" },
  { id: "post-wch", label: "帰国・回復", labelEn: "POST WCH RECOVERY", emoji: "✈️", kind: "travel",
    start: "2026-08-31", end: "2026-09-10", days: 11, weight: 11,
    desc: "完全休＋低強度メンテ。アジア大会まで20日。" },
  { id: "asia-camp", label: "アジア大会前合宿", labelEn: "ASIA CAMP", emoji: "🚣", kind: "natl",
    start: "2026-09-11", end: "2026-09-19", days: 9, weight: 9,
    desc: "国内合宿。長良川水域順応。ピーク2作り。" },
  { id: "asia", label: "アジア大会", labelEn: "ASIAN GAMES", emoji: "🏆", kind: "race-int",
    start: "2026-09-20", end: "2026-09-25", days: 6, weight: 6, peak: 2, marker: "★",
    desc: "★ P2 — HOME PEAK。地元水域、メダル狙い。" },
];

// 時系列順。rank はピーク順（1=最重要）
const CAMPAIGNS = [
  { id: "wc1", rank: 3, nameJp: "ワールドカップⅠ", nameEn: "WORLD ROWING CUP I",
    where: "🇪🇸 セビリア", whereEn: "SEVILLE · ESP",
    dates: "5月29日 — 31日", datesEn: "MAY 29 — 31",
    role: "PRELUDE ／ OPENER",
    targetDate: "2026-05-29",
    note: "シーズン初戦。WCH選考の前哨戦。" },
  { id: "wch", rank: 1, nameJp: "世界ローイング選手権", nameEn: "WORLD ROWING CHAMPIONSHIPS",
    where: "🇳🇱 アムステルダム", whereEn: "AMSTERDAM · NED",
    dates: "8月23日 — 30日", datesEn: "AUG 23 — 30",
    role: "PEAK 1 ／ FULL PEAK",
    targetDate: "2026-08-23",
    note: "本命。すべてはここに集まる。" },
  { id: "asia", rank: 2, nameJp: "アジア競技大会", nameEn: "ASIAN GAMES",
    where: "🇯🇵 長良川", whereEn: "NAGARAGAWA · JPN",
    dates: "9月20日 — 25日", datesEn: "SEP 20 — 25",
    role: "PEAK 2 ／ HOME PEAK",
    targetDate: "2026-09-20",
    note: "地元水域・第2ピーク。WCH余韻＋短期再ピーキング。" },
];

const DAY_MENU = {
  // Block 2 終盤
  "2026-05-20": { menu: "Z1 90' ／ S&C", tag: "Block2 後半" },
  "2026-05-21": { menu: "Z3 500m×8 ／ Z1 60'", key: true },
  "2026-05-22": { menu: "Z2 10'×4 ／ Z1 60'" },
  "2026-05-23": { menu: "Z1 120' ／ Bike 60'" },
  "2026-05-24": { menu: "Start 20本 ／ Z1 45'" },
  "2026-05-25": { menu: "完全休 ／ 移動", tag: "セビリア出発" },
  "2026-05-26": { menu: "🇪🇸 現地着 ／ Z1 30' 軽め" },
  "2026-05-27": { menu: "🇪🇸 現地練 Z2 ／ コース下見", key: true },
  "2026-05-28": { menu: "🇪🇸 公式練 ／ スタート確認" },
  // WC1
  "2026-05-29": { menu: "🇪🇸 WC1 予選", race: true },
  "2026-05-30": { menu: "🇪🇸 WC1 準決勝", race: true },
  "2026-05-31": { menu: "🇪🇸 WC1 決勝", race: true },
  // post-WC1
  "2026-06-01": { menu: "✈️ 帰国移動", tag: "帰国" },
  "2026-06-02": { menu: "完全休／時差調整" },
  "2026-06-03": { menu: "完全休 or 散歩40'" },
  "2026-06-04": { menu: "Z1艇 45' 軽め" },
  // WC3向け強化スタート
  "2026-06-08": { menu: "S&C ＋ Z1 60'", tag: "Block3 開始" },
  "2026-06-15": { menu: "Z3 1000m×4 ／ Z1 90'", key: true },
  "2026-06-20": { menu: "Z3 500m×12 ／ S&C", key: true },
  "2026-06-23": { menu: "短期テーパー", tag: "WC3前" },
  "2026-06-25": { menu: "✈️ ルツェルン移動" },
  // WC3
  "2026-06-26": { menu: "🇨🇭 WC3 予選", race: true },
  "2026-06-27": { menu: "🇨🇭 WC3 準決勝", race: true },
  "2026-06-28": { menu: "🇨🇭 WC3 決勝 ＝ WCH選考最終評価", race: true },
  // 夏期強化
  "2026-06-29": { menu: "✈️ 帰国" },
  "2026-07-05": { menu: "Z3 750m×6 ／ Z1 60'", key: true },
  "2026-07-15": { menu: "Z3 4'×6 ／ Z1 60'", key: true },
  "2026-07-26": { menu: "Time Trial 2000m", key: true, tag: "中間TT" },
  // 夏期強化2
  "2026-07-27": { menu: "Z1 90' 回復" },
  "2026-08-05": { menu: "Z3 250m×12 r60s", key: true },
  "2026-08-12": { menu: "Z3 8'×3 ／ Z2 r30s", key: true },
  "2026-08-15": { menu: "短期テーパー開始", tag: "ピーキング" },
  // 蘭事前合宿
  "2026-08-16": { menu: "✈️ 🇳🇱 出国", tag: "蘭事前合宿へ" },
  "2026-08-17": { menu: "🇳🇱 現地着 ／ 軽 Z1" },
  "2026-08-18": { menu: "🇳🇱 水域順応 Z1艇 60'" },
  "2026-08-19": { menu: "🇳🇱 Z2 8'×3 コース確認", key: true },
  "2026-08-20": { menu: "🇳🇱 スタート練 ／ Z1 45'" },
  "2026-08-21": { menu: "🇳🇱 公式練 / レースペース 250m" },
  "2026-08-22": { menu: "🇳🇱 軽め ／ Race Day 前日" },
  // 世界選手権 (P1)
  "2026-08-23": { menu: "🇳🇱 WCH 予選", race: true, peak: true },
  "2026-08-24": { menu: "🇳🇱 WCH 敗復 / 軽め" },
  "2026-08-25": { menu: "🇳🇱 WCH 準々決勝", race: true },
  "2026-08-26": { menu: "🇳🇱 WCH 軽め" },
  "2026-08-27": { menu: "🇳🇱 WCH 準決勝", race: true },
  "2026-08-28": { menu: "🇳🇱 WCH 軽め" },
  "2026-08-29": { menu: "🇳🇱 WCH 軽め ／ 決勝前日" },
  "2026-08-30": { menu: "🇳🇱 WCH 決勝 ＝ ★ P1 FULL PEAK", race: true, peak: true },
  // post-WCH
  "2026-08-31": { menu: "✈️ 帰国 ／ 完全休", tag: "回復期" },
  "2026-09-05": { menu: "Z1艇 45' 軽め" },
  "2026-09-10": { menu: "Z2 8'×2 r30s ／ 軽め", key: true },
  // アジア大会前合宿
  "2026-09-11": { menu: "長良川入り ／ Z1 60'", tag: "アジア合宿開始" },
  "2026-09-13": { menu: "Z3 500m×6 ／ Z1", key: true },
  "2026-09-15": { menu: "Z2 10'×3 ／ スタート練", key: true },
  "2026-09-17": { menu: "Z3 250m×8 r60s", key: true },
  "2026-09-19": { menu: "軽め ／ レース前日" },
  // アジア大会 (P2)
  "2026-09-20": { menu: "🇯🇵 アジア大会 予選", race: true, peak: true },
  "2026-09-21": { menu: "🇯🇵 軽め" },
  "2026-09-22": { menu: "🇯🇵 準決勝", race: true },
  "2026-09-23": { menu: "🇯🇵 軽め" },
  "2026-09-24": { menu: "🇯🇵 軽め ／ 決勝前日" },
  "2026-09-25": { menu: "🇯🇵 決勝 ＝ ★ P2 HOME PEAK", race: true, peak: true },
};

const QUOTES = [
  { en: "DOUBLE PEAK. ONE MIND.", jp: "ふたつのピーク、ひとつの志。" },
  { en: "ROW Z1 IN Z1.", jp: "Z1は Z1で漕げ。軽い日は本気で軽く。" },
  { en: "RECOVERY IS THE WORK.", jp: "回復こそが、訓練。" },
  { en: "WIN THE WAIT.", jp: "待つことに勝て。" },
  { en: "ONE OAR. ONE GOAL.", jp: "一本のオール、ひとつのゴール。" },
  { en: "TRUST THE PLAN. TRUST THE BODY.", jp: "計画を信じ、体を信じよ。" },
  { en: "AMSTERDAM, THEN NAGARAGAWA.", jp: "まずアムステルダム、次に長良川。" },
  { en: "EARN THE PEAK.", jp: "ピークは作るんじゃない、勝ち取るもの。" },
  { en: "THE LAKE REMEMBERS EVERY STROKE.", jp: "湖は、すべての一漕ぎを覚えている。" },
  { en: "FROM TOKYO, TO THE WORLD.", jp: "東京から、世界へ。" },
];

// ============================================================================

const SEASON_START = "2026-05-20";
const SEASON_END = "2026-09-25";

const iso = (d) => {
  const y = d.getFullYear();
  const m = String(d.getMonth() + 1).padStart(2, "0");
  const day = String(d.getDate()).padStart(2, "0");
  return `${y}-${m}-${day}`;
};
const parseISO = (s) => new Date(s + "T00:00:00+09:00");
const daysBetween = (a, b) => Math.round((parseISO(b) - parseISO(a)) / 86400000);

const findPhase = (dateISO) => {
  return PHASES.find((p) => dateISO >= p.start && dateISO <= p.end);
};

const dayInPhase = (phase, dateISO) => daysBetween(phase.start, dateISO) + 1;

const weekDates = (dateISO) => {
  const d = parseISO(dateISO);
  const day = (d.getDay() + 6) % 7;
  const monday = new Date(d);
  monday.setDate(d.getDate() - day);
  return Array.from({ length: 7 }, (_, i) => {
    const dd = new Date(monday);
    dd.setDate(monday.getDate() + i);
    return iso(dd);
  });
};

const fmtJp = (dateISO) => {
  const d = parseISO(dateISO);
  return `${d.getMonth() + 1}/${d.getDate()}`;
};
const weekdayJp = ["日", "月", "火", "水", "木", "金", "土"];
const weekdayEn = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];

// ============================================================================
//  STATE METRICS — TODAY タブの要約に使う（STATEタブの sakurama-state.html と同じ値）
//  値を変えるときは sakurama-state.html も合わせて更新すること
// ============================================================================
const STATE_METRICS = {
  hooper: { total: 16, max: 28, state: "safe", stateLabel: "SAFE 安定",
            subs: { sleep: 5, fatigue: 4, stress: 3, soreness: 4 } },
  acwr:   { value: 1.15, state: "sweet", stateLabel: "SWEET SPOT",
            load28d: 4820, deltaPct: 8 },
  tsb:    { value: 2, state: "tapered", stateLabel: "TAPERED",
            ctl: 68, atl: 66, note: "鮮度出てる" },
  monotony: { value: 1.4, state: "safe", stateLabel: "SAFE" },
  strain: { value: 2140 },
  sessions7d: { count: 11, hours: 13, breakdown: "8艇 · 2erg · 1S&C" },
  hr_zones: {
    actual: { z1: 72, z2: 18, z3: 10 },
    target: { z1: 80, z2: 15, z3: 5 },
  },
  // 警告（複数可）
  warnings: [
    { sev: "warn", text: "Z2/Z3 が目標を合計 +8pt 超過。WC1前で抜く判断推奨。" },
  ],
  recommendation: {
    sessionEn: "Z1 LONG 90'",
    sessionJp: "Z1 ロング 90分",
    rate: "18-20", split: "2:25-35", rpe: "3-4",
    reason: "Z2が目標+3pt、Z3が+5ptで過負荷気味。WC1まで残り2日のため、本日は絶対に高強度を乗せない。Hooper 16/28は安定、Z1ロングで貯金を作る判断。",
  },
};

window.PB = {
  PHASES, CAMPAIGNS, DAY_MENU, QUOTES,
  SEASON_START, SEASON_END,
  STATE_METRICS,
  iso, parseISO, daysBetween, findPhase, dayInPhase,
  weekDates, fmtJp, weekdayJp, weekdayEn,
};
