// ============================================================================
//  PLAYBOOK DATA — 選手 千晴（BW2x ／ W2x ／ 東北大学 ／ U23 JPN）  [自動生成]
//  実データ主導。CAMPAIGNS=JARA編成。PHASES=レース日程から導いた大枠のみ。
//  日々の詳細メニューは空＝コーチ設定待ち。実施した練習は「TREND（体調の推移）」に自動表示。
// ============================================================================
const ATHLETE = { id: "demo", jp: "テスト 太郎", en: "TARO · TEST", sub: "テスト 太郎 ／ デモ大学 ／ M1x（デモ） ／ DEMO JPN", sex: "M", klass: "M1x（デモ）", partner: null, lw: false, squad: "DEMO", groups: [], weights: null, weight_target: null /* 目標体重(kg)。null=非表示（選手ごとに数値を入れると PROFILE/年表に出る） */, menu_pdf: null };
const PRINCIPLE = {"en":"DUISBURG → NAGARAGAWA.","jp":"BW2x ／ W2x。🇩🇪デュイスブルク → 🇯🇵長良川 ── 期分けの大枠はレース日程から。実施した練習は「TREND（体調の推移）」に自動記録。"};
const ROAD_SUB = "この夏の道のり ／ 5月 → 9月（U23 → アジア）";
const MY_WALL = [{"y":"2026","t":"デモ用の漕歴（ダミー）── 本物のデータではありません"}];

const PHASES = [
  {
    "id": "u23prep",
    "label": "U23 準備",
    "labelEn": "U23 — BUILD",
    "emoji": "🚣",
    "kind": "natl",
    "start": "2026-05-25",
    "end": "2026-07-22",
    "days": 59,
    "weight": 59,
    "desc": "U23世界選手権に向けた準備期。"
  },
  {
    "id": "u23",
    "label": "U23",
    "labelEn": "U23 WORLD ROWING CHAMPS",
    "emoji": "⭐",
    "kind": "race-int",
    "start": "2026-07-23",
    "end": "2026-07-26",
    "days": 4,
    "weight": 4,
    "peak": 1,
    "marker": "★",
    "desc": "★ U23世界選手権・BW2x ／ W2x。"
  },
  {
    "id": "asiaprep",
    "label": "アジア 準備",
    "labelEn": "アジア — BUILD",
    "emoji": "🚣",
    "kind": "design",
    "start": "2026-07-27",
    "end": "2026-09-19",
    "days": 55,
    "weight": 55,
    "desc": "アジア競技大会に向けた準備期。"
  },
  {
    "id": "asia",
    "label": "アジア",
    "labelEn": "ASIAN GAMES",
    "emoji": "⭐",
    "kind": "race-jp",
    "start": "2026-09-20",
    "end": "2026-09-25",
    "days": 6,
    "weight": 6,
    "peak": 2,
    "marker": "★",
    "desc": "★ アジア競技大会・BW2x ／ W2x。"
  }
];

const CAMPAIGNS = [
  {
    "id": "u23",
    "rank": 1,
    "nameJp": "U23世界選手権",
    "nameEn": "U23 WORLD ROWING CHAMPS",
    "where": "🇩🇪 ドイツ・デュイスブルク",
    "whereEn": "DUISBURG · GER",
    "datesEn": "JUL 23 — 26",
    "role": "NEXT RACE ／ BW2x ／ W2x",
    "targetDate": "2026-07-23",
    "short": "U23",
    "note": "選手 幸乃とのBW2x ／ W2x。次の、世界の舞台。"
  },
  {
    "id": "asia",
    "rank": 2,
    "nameJp": "アジア競技大会",
    "nameEn": "ASIAN GAMES",
    "where": "🇯🇵 長良川",
    "whereEn": "NAGARAGAWA · JPN",
    "datesEn": "SEP 20 — 25",
    "role": "HOME GAMES ／ BW2x ／ W2x",
    "targetDate": "2026-09-20",
    "short": "アジア",
    "note": "選手 幸乃とのBW2x ／ W2x。"
  }
];

const DAY_MENU = {
  "2026-07-23": {
    "menu": "🇩🇪 U23 ／ BW2x ／ W2x",
    "race": true
  },
  "2026-07-24": {
    "menu": "🇩🇪 U23 ／ BW2x ／ W2x",
    "race": true
  },
  "2026-07-25": {
    "menu": "🇩🇪 U23 ／ BW2x ／ W2x",
    "race": true
  },
  "2026-07-26": {
    "menu": "🇩🇪 U23 ／ BW2x ／ W2x",
    "race": true,
    "peak": true
  },
  "2026-08-08": {
    "menu": "Z1 100' ／ Core＋ストレッチ ／ OFF（ダミー）"
  },
  "2026-08-09": {
    "menu": "Z1+Z3 500m×6 RP 90' ／ S&C ／ OFF（ダミー）",
    "key": true
  },
  "2026-08-10": {
    "menu": "Z1 90' ／ S&C ／ Erg Z1 30'（ダミー）"
  },
  "2026-08-11": {
    "menu": "Z1+Z3 1000m×4 r30 90' ／ Core＋ストレッチ ／ OFF（ダミー）",
    "key": true
  },
  "2026-08-12": {
    "menu": "Z1 120' ／ OFF ／ Bike Z1 60'（ダミー）"
  },
  "2026-08-13": {
    "menu": "OFF"
  },
  "2026-08-14": {
    "menu": "Z1+Z2 抵抗10'×4 90' ／ S&C ／ Erg Z1 25'×2（ダミー）"
  },
  "2026-08-15": {
    "menu": "Z1 100' ／ Core＋ストレッチ ／ OFF（ダミー）"
  },
  "2026-08-16": {
    "menu": "Z1+Z3 500m×6 RP 90' ／ S&C ／ OFF（ダミー）",
    "key": true
  },
  "2026-08-17": {
    "menu": "Z1 90' ／ S&C ／ Erg Z1 30'（ダミー）"
  },
  "2026-08-18": {
    "menu": "Z1+Z3 1000m×4 r30 90' ／ Core＋ストレッチ ／ OFF（ダミー）",
    "key": true
  },
  "2026-08-19": {
    "menu": "Z1 120' ／ OFF ／ Bike Z1 60'（ダミー）"
  },
  "2026-08-20": {
    "menu": "OFF"
  },
  "2026-08-21": {
    "menu": "Z1+Z2 抵抗10'×4 90' ／ S&C ／ Erg Z1 25'×2（ダミー）"
  },
  "2026-08-22": {
    "menu": "Z1 100' ／ Core＋ストレッチ ／ OFF（ダミー）"
  },
  "2026-08-23": {
    "menu": "Z1+Z3 500m×6 RP 90' ／ S&C ／ OFF（ダミー）",
    "key": true
  },
  "2026-08-24": {
    "menu": "Z1 90' ／ S&C ／ Erg Z1 30'（ダミー）"
  },
  "2026-08-25": {
    "menu": "Z1+Z3 1000m×4 r30 90' ／ Core＋ストレッチ ／ OFF（ダミー）",
    "key": true
  },
  "2026-08-26": {
    "menu": "Z1 120' ／ OFF ／ Bike Z1 60'（ダミー）"
  },
  "2026-08-27": {
    "menu": "OFF"
  },
  "2026-08-28": {
    "menu": "Z1+Z2 抵抗10'×4 90' ／ S&C ／ Erg Z1 25'×2（ダミー）"
  },
  "2026-08-29": {
    "menu": "Z1 100' ／ Core＋ストレッチ ／ OFF（ダミー）"
  },
  "2026-08-30": {
    "menu": "Z1+Z3 500m×6 RP 90' ／ S&C ／ OFF（ダミー）",
    "key": true
  },
  "2026-08-31": {
    "menu": "Z1 90' ／ S&C ／ Erg Z1 30'（ダミー）"
  },
  "2026-09-01": {
    "menu": "Z1+Z3 1000m×4 r30 90' ／ Core＋ストレッチ ／ OFF（ダミー）",
    "key": true
  },
  "2026-09-02": {
    "menu": "Z1 120' ／ OFF ／ Bike Z1 60'（ダミー）"
  },
  "2026-09-03": {
    "menu": "OFF"
  },
  "2026-09-04": {
    "menu": "Z1+Z2 抵抗10'×4 90' ／ S&C ／ Erg Z1 25'×2（ダミー）"
  },
  "2026-09-05": {
    "menu": "Z1 100' ／ Core＋ストレッチ ／ OFF（ダミー）"
  },
  "2026-09-06": {
    "menu": "Z1+Z3 500m×6 RP 90' ／ S&C ／ OFF（ダミー）",
    "key": true
  },
  "2026-09-07": {
    "menu": "Z1 90' ／ S&C ／ Erg Z1 30'（ダミー）"
  },
  "2026-09-08": {
    "menu": "Z1+Z3 1000m×4 r30 90' ／ Core＋ストレッチ ／ OFF（ダミー）",
    "key": true
  },
  "2026-09-09": {
    "menu": "Z1 120' ／ OFF ／ Bike Z1 60'（ダミー）"
  },
  "2026-09-10": {
    "menu": "OFF"
  },
  "2026-09-11": {
    "menu": "Z1+Z2 抵抗10'×4 90' ／ S&C ／ Erg Z1 25'×2（ダミー）"
  },
  "2026-09-12": {
    "menu": "Z1 100' ／ Core＋ストレッチ ／ OFF（ダミー）"
  },
  "2026-09-13": {
    "menu": "Z1+Z3 500m×6 RP 90' ／ S&C ／ OFF（ダミー）",
    "key": true
  },
  "2026-09-14": {
    "menu": "Z1 90' ／ S&C ／ Erg Z1 30'（ダミー）"
  },
  "2026-09-15": {
    "menu": "Z1+Z3 1000m×4 r30 90' ／ Core＋ストレッチ ／ OFF（ダミー）",
    "key": true
  },
  "2026-09-16": {
    "menu": "Z1 120' ／ OFF ／ Bike Z1 60'（ダミー）"
  },
  "2026-09-17": {
    "menu": "OFF"
  },
  "2026-09-18": {
    "menu": "Z1+Z2 抵抗10'×4 90' ／ S&C ／ Erg Z1 25'×2（ダミー）"
  },
  "2026-09-19": {
    "menu": "Z1 100' ／ Core＋ストレッチ ／ OFF（ダミー）"
  },
  "2026-09-20": {
    "menu": "🇯🇵 アジア ／ BW2x ／ W2x",
    "race": true
  },
  "2026-09-21": {
    "menu": "🇯🇵 アジア ／ BW2x ／ W2x",
    "race": true
  },
  "2026-09-22": {
    "menu": "🇯🇵 アジア ／ BW2x ／ W2x",
    "race": true
  },
  "2026-09-23": {
    "menu": "🇯🇵 アジア ／ BW2x ／ W2x",
    "race": true
  },
  "2026-09-24": {
    "menu": "🇯🇵 アジア ／ BW2x ／ W2x",
    "race": true
  },
  "2026-09-25": {
    "menu": "🇯🇵 アジア ／ BW2x ／ W2x",
    "race": true,
    "peak": true
  },
  "2026-09-26": {
    "menu": "Z1 100' ／ Core＋ストレッチ ／ OFF（ダミー）"
  },
  "2026-09-27": {
    "menu": "Z1+Z3 500m×6 RP 90' ／ S&C ／ OFF（ダミー）",
    "key": true
  },
  "2026-09-28": {
    "menu": "Z1 90' ／ S&C ／ Erg Z1 30'（ダミー）"
  },
  "2026-09-29": {
    "menu": "Z1+Z3 1000m×4 r30 90' ／ Core＋ストレッチ ／ OFF（ダミー）",
    "key": true
  },
  "2026-09-30": {
    "menu": "Z1 120' ／ OFF ／ Bike Z1 60'（ダミー）"
  },
  "2026-10-01": {
    "menu": "OFF"
  },
  "2026-10-02": {
    "menu": "Z1+Z2 抵抗10'×4 90' ／ S&C ／ Erg Z1 25'×2（ダミー）"
  },
  "2026-10-03": {
    "menu": "Z1 100' ／ Core＋ストレッチ ／ OFF（ダミー）"
  },
  "2026-10-04": {
    "menu": "Z1+Z3 500m×6 RP 90' ／ S&C ／ OFF（ダミー）",
    "key": true
  },
  "2026-10-05": {
    "menu": "Z1 90' ／ S&C ／ Erg Z1 30'（ダミー）"
  },
  "2026-10-06": {
    "menu": "Z1+Z3 1000m×4 r30 90' ／ Core＋ストレッチ ／ OFF（ダミー）",
    "key": true
  },
  "2026-10-07": {
    "menu": "Z1 120' ／ OFF ／ Bike Z1 60'（ダミー）"
  }
};

const QUOTES = [
  {
    "en": "EARN THE PEAK.",
    "jp": "ピークは作るんじゃない、勝ち取るもの。"
  },
  {
    "en": "ROW Z1 IN Z1.",
    "jp": "Z1は Z1で漕げ。軽い日は本気で軽く。"
  },
  {
    "en": "RECOVERY IS THE WORK.",
    "jp": "回復こそが、訓練。"
  },
  {
    "en": "THE WATER REMEMBERS EVERY STROKE.",
    "jp": "水は、すべての一漕ぎを覚えている。"
  },
  {
    "en": "TRUST THE PLAN. TRUST THE BODY.",
    "jp": "計画を信じ、体を信じよ。"
  },
  {
    "en": "WIN THE WAIT.",
    "jp": "待つことに勝て。"
  },
  {
    "en": "ALREADY ON THE WALL.",
    "jp": "あなたはもう、漕史の壁にいる。"
  },
  {
    "en": "ONE OAR. ONE GOAL.",
    "jp": "一本のオール、ひとつのゴール。"
  },
  {
    "en": "SMALL THINGS, DONE DAILY.",
    "jp": "小さなことを、毎日。"
  },
  {
    "en": "REPRESENT.",
    "jp": "背負う旗のために。"
  }
];

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

const iso = (d) => { const y=d.getFullYear(), m=String(d.getMonth()+1).padStart(2,"0"), 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) => 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"];

// ★ DEMO: すべてダミーデータ（本物の選手ではありません）
window.PB = { ATHLETE, MY_WALL, PRINCIPLE, ROAD_SUB, PHASES, CAMPAIGNS, DAY_MENU, QUOTES, SEASON_START, SEASON_END,
  TZ_OFFSET_HOURS: 9,  // 「今日」判定に使う所在地時刻（欧州遠征=2 / 既定=9 JST）。EU_TZ と同期。
  iso, parseISO, daysBetween, findPhase, dayInPhase, weekDates, fmtJp, weekdayJp, weekdayEn };
