// TUS 2026 — Plan data + skeleton generator
// Plan başlangıç: 24 Nisan 2026 Cuma
// TUS: 26 Ağustos 2026 Çarşamba
// Toplam ~124 gün

const PLAN_START = new Date(2026, 3, 25); // 25 April 2026
const TUS_DATE   = new Date(2026, 7, 26); // 26 August 2026

// --- Dersler — SAKIN PASTEL (ADHD uyumlu, düşük satürasyon) ---
// tag: ders kısa kodu, name: görünecek ad, color: accent, type: 'normal' (2günlük) | 'big' (3günlük), group
const LESSONS = [
  { tag: 'PATO',  name: 'Patoloji',        color: '#D4A5A5', type: 'normal', group: 1 },
  { tag: 'DAH',   name: 'Dahiliye',        color: '#C9B896', type: 'big',    group: 1 },
  { tag: 'MIK',   name: 'Mikrobiyoloji',   color: '#A8C4A2', type: 'normal', group: 1 },
  { tag: 'FARM',  name: 'Farmakoloji',     color: '#C4B0D4', type: 'normal', group: 1 },
  { tag: 'BK',    name: 'Biyokimya',       color: '#A5C4C4', type: 'normal', group: 2 },
  { tag: 'PED',   name: 'Pediatri',        color: '#E0B894', type: 'big',    group: 2 },
  { tag: 'KHD',   name: 'Kadın Doğum',     color: '#D4A5BB', type: 'normal', group: 2 },
  { tag: 'GC',    name: 'Genel Cerrahi',   color: '#A8B8D4', type: 'normal', group: 3 },
  { tag: 'ANAT',  name: 'Anatomi',         color: '#BFAE95', type: 'normal', group: 3 },
  { tag: 'KS',    name: 'Küçük Stajlar',   color: '#B5C2CC', type: 'normal', group: 3 },
  { tag: 'FIZ',   name: 'Fizyoloji',       color: '#B4A8C4', type: 'normal', group: 3 },
];

// --- Derse özel çalışma notları (her part'ın altında tekrar gösterilecek) ---
const LESSON_NOTES = {
  ANAT:  'Görsellere odaklan · şekil + tabloları ez · klinik nüanslara bak',
  FIZ:   'Şekil ve grafiklere odaklan · mekanizmaları anlat',
  PATO:  'Temel derslerin kraliçesi · DETAY çalış · yatırımı burada yap',
  MIK:   'Tabloları ezber · algoritma oluştur · klinik vakaya bağla',
  FARM:  'İlaç grubu mantığı · yan etki tablolarını çıkar',
  BK:    'Yol şemaları · enzim bozuklukları · klinik yansımaları',
  DAH:   'Vaka tabanlı oku · tanı kriterleri · algoritmalar',
  PED:   'Vaka tabanlı oku · yaş grubu ayırıcı tanı',
  KHD:   'Klinik hızlı okuma · takılma · Pato-Farma-Dah zemini üstüne bina',
  GC:    'Klinik hızlı okuma · takılma · temel derse yatırımı sürdür',
  KS:    'Küçük stajlar · yüksek skor/düşük efor oranı · algoritma yeter',
};

const LESSON_BY_TAG = Object.fromEntries(LESSONS.map(l => [l.tag, l]));

// --- Sabit bloklar ---
// İSG: 16 Mayıs Cumartesi sınav. Hazırlık: 10 gün → 6 Mayıs–15 Mayıs
// Kıbrıs: 17–20 Temmuz (4 gün off)
// TUS: 26 Ağustos
const FIXED_EVENTS = [
  { date: '2026-05-16', kind: 'exam', title: 'İşyeri Hekimliği Sınavı', color: '#FFB84D', locked: true },
  { date: '2026-07-17', kind: 'off',  title: 'Kıbrıs — Tatil', color: '#4DA6FF', locked: true },
  { date: '2026-07-18', kind: 'off',  title: 'Kıbrıs — Tatil', color: '#4DA6FF', locked: true },
  { date: '2026-07-19', kind: 'off',  title: 'Kıbrıs — Tatil', color: '#4DA6FF', locked: true },
  { date: '2026-07-20', kind: 'off',  title: 'Kıbrıs — Tatil', color: '#4DA6FF', locked: true },
  { date: '2026-08-26', kind: 'tus',  title: '🎯 TUS 2026', color: '#E06B6B', locked: true },
];

// --- Yardımcılar ---
function fmtDate(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}`;
}
function parseDate(s) {
  const [y, m, d] = s.split('-').map(Number);
  return new Date(y, m - 1, d);
}
function addDays(d, n) {
  const r = new Date(d);
  r.setDate(r.getDate() + n);
  return r;
}
function daysBetween(a, b) {
  const MS = 1000 * 60 * 60 * 24;
  return Math.round((b - a) / MS);
}
function isSunday(d) { return d.getDay() === 0; }

// --- İskelet üretici ---
// Her gün için { date, phase, morning: Task[], evening: Task[], note }
// Task: { id, lesson, kind: 'speetus'|'tts'|'exam-prep'|'off'|'deneme'|'vaka'|'book'|'cikti'|'spot', hours, title, done:false, tag? }

function uid() {
  return 'id_' + Math.random().toString(36).slice(2, 10);
}

function makeTask(partial) {
  const t = {
    id: uid(),
    done: false,
    hours: 4,
    ...partial,
  };
  // Ders bazlı çalışma notu (sürekli hatırlatma)
  if (t.lesson && LESSON_NOTES[t.lesson] && !t.reminder) {
    t.reminder = LESSON_NOTES[t.lesson];
  }
  return t;
}

function generateSkeleton() {
  const days = {};
  // 26 Nisan 2026 → normal çalışma günü (ilk hafta istisna)
  const isSunday = (d) => {
    if (d.getDay() !== 0) return false;
    if (d.getFullYear() === 2026 && d.getMonth() === 3 && d.getDate() === 26) return false;
    return true;
  };
  const totalDays = daysBetween(PLAN_START, TUS_DATE) + 1; // incl TUS
  for (let i = 0; i < totalDays; i++) {
    const d = addDays(PLAN_START, i);
    days[fmtDate(d)] = {
      date: fmtDate(d),
      phase: null,
      morning: [],
      evening: [],
      note: '',
    };
  }

  // Sabit bloklar
  for (const ev of FIXED_EVENTS) {
    const day = days[ev.date];
    if (!day) continue;
    if (ev.kind === 'off' || ev.kind === 'tus' || ev.kind === 'exam') {
      day.morning = [makeTask({ kind: ev.kind, title: ev.title, hours: 0, locked: true, color: ev.color })];
      day.evening = [makeTask({ kind: ev.kind, title: ev.title, hours: 0, locked: true, color: ev.color })];
    }
  }

  // Pazar denemeleri — Faz 1 içinde
  // Faz 1: 24 Nisan – 22 Haziran (60 gün). Ama İSG hazırlığı 6 Mayıs–15 Mayıs içeride.
  // Denemeleri Pazar'a koy; ancak Kıbrıs/İSG/TUS günü ise atla.
  const PHASES = [
    { name: 'Faz 1 — Ana Çalışma', start: '2026-04-25', end: '2026-06-22', color: '#7FB069' },
    { name: 'Faz 2 — Tekrar',      start: '2026-06-23', end: '2026-07-26', color: '#6FB3B8' },
    { name: 'Faz 3 — Son Ay',      start: '2026-07-27', end: '2026-08-25', color: '#E06B6B' },
    { name: 'TUS',                  start: '2026-08-26', end: '2026-08-26', color: '#E06B6B' },
  ];
  for (const p of PHASES) {
    let cur = parseDate(p.start);
    const end = parseDate(p.end);
    while (cur <= end) {
      const key = fmtDate(cur);
      if (days[key]) days[key].phase = p.name;
      cur = addDays(cur, 1);
    }
  }

  // ---- FAZ 1 — Ana çalışma iskeleti ----
  // Sabah: Speetus izleme. Akşam: TTS (8 gün geriden gelir).
  // Sıra: Dahiliye TTS İLK gelir (ilk haftanın akşamları için), sonra Pato TTS vs...
  // Ama Speetus tarafı: Grup 1 başla — Pato 4g, Dahiliye 6g, Mikro 4g, Farma 4g, sonra Grup 2: BK 4g, Pediatri 6g, KHD 4g, sonra Grup 3: GC 4g, Anatomi 4g, KS 4g, Fizyoloji 4g
  // = 4+6+4+4 + 4+6+4 + 4+4+4+4 = 18 + 14 + 16 = 48 gün ✓

  const speetusOrder = [
    { tag: 'PATO', days: 4 },
    { tag: 'DAH',  days: 6 },
    { tag: 'MIK',  days: 4 },
    { tag: 'FARM', days: 4 },
    { tag: 'BK',   days: 4 },
    { tag: 'PED',  days: 6 },
    { tag: 'KHD',  days: 4 },
    { tag: 'GC',   days: 4 },
    { tag: 'ANAT', days: 4 },
    { tag: 'KS',   days: 4 },
    { tag: 'FIZ',  days: 3 },
  ];
  // TTS sırası: Dahiliye ilk (ilk hafta akşamı boş kalmasın), sonra diğerleri Speetus sırası ile
  const ttsOrder = [
    { tag: 'DAH',  days: 6 },
    { tag: 'PATO', days: 4 },
    { tag: 'MIK',  days: 4 },
    { tag: 'FARM', days: 4 },
    { tag: 'BK',   days: 4 },
    { tag: 'PED',  days: 6 },
    { tag: 'KHD',  days: 4 },
    { tag: 'GC',   days: 4 },
    { tag: 'ANAT', days: 4 },
    { tag: 'KS',   days: 4 },
    { tag: 'FIZ',  days: 4 },
  ];

  // Faz 1 aralığı içindeki "çalışılabilir" günler = pazar değil, sabit blok değil, İSG hazırlık değil
  // İSG hazırlığı: 6 Mayıs–15 Mayıs. Son 3 gün (13-14-15 May) tam İSG (8h). Önceki 7 gün (6-12 May) sabah 4h TUS + akşam 4h İSG
  const isgPrepStart = parseDate('2026-05-06');
  const isgPrepEnd   = parseDate('2026-05-15');
  const isgFullStart = parseDate('2026-05-13');

  function isWorkableMorning(dateStr) {
    const day = days[dateStr];
    if (!day) return false;
    if (day.morning.length > 0) return false; // zaten sabit
    const d = parseDate(dateStr);
    if (isSunday(d)) return false;
    if (d >= isgFullStart && d <= isgPrepEnd) return false; // son 3 gün tam İSG
    // Buffer günleri (Faz 1 sonu 22 Haz; Faz 2 sonu 25-26 Tem)
    if (dateStr === '2026-06-22' ||
        dateStr === '2026-07-25' || dateStr === '2026-07-26') return false;
    if (dateStr === '2026-07-05' || dateStr === '2026-07-12') return false;
    return true;
  }
  function isWorkableEvening(dateStr) {
    const day = days[dateStr];
    if (!day) return false;
    if (day.evening.length > 0) return false;
    const d = parseDate(dateStr);
    if (isSunday(d)) return false;
    if (d >= isgPrepStart && d <= isgPrepEnd) return false; // İSG hazırlık 10 gün — akşamlar İSG
    // Buffer günleri
    if (dateStr === '2026-06-22' ||
        dateStr === '2026-07-25' || dateStr === '2026-07-26') return false;
    if (dateStr === '2026-07-05' || dateStr === '2026-07-12') return false;
    return true;
  }

  // Sabah bloklarına Speetus sırasıyla yerleştir
  const phase1Start = parseDate('2026-04-25');
  const phase1End   = parseDate('2026-06-22');

  let cursor = new Date(phase1Start);
  let orderIdx = 0;
  let remaining = speetusOrder[0].days;
  let partIdx = 1;
  while (cursor <= phase1End && orderIdx < speetusOrder.length) {
    const key = fmtDate(cursor);
    if (isWorkableMorning(key)) {
      const ord = speetusOrder[orderIdx];
      const lesson = LESSON_BY_TAG[ord.tag];
      days[key].morning.push(makeTask({
        kind: 'speetus',
        lesson: ord.tag,
        title: `Speetus — ${lesson.name}`,
        hours: 4,
        color: lesson.color,
        partIdx, partTotal: ord.days,
      }));
      remaining--;
      partIdx++;
      if (remaining === 0) {
        orderIdx++;
        partIdx = 1;
        if (orderIdx < speetusOrder.length) remaining = speetusOrder[orderIdx].days;
      }
    }
    cursor = addDays(cursor, 1);
  }

  // Akşam bloklarına TTS sırası (ama İSG hazırlık akşamları hariç)
  // 48 ders TTS, Faz 1'de 42 akşam → 6 ders TTS Faz 2 başına spill eder
  cursor = new Date(phase1Start);
  orderIdx = 0;
  remaining = ttsOrder[0].days;
  partIdx = 1;
  const phase2Start_forTTS = parseDate('2026-06-23');
  const phase2End_forTTS   = parseDate('2026-07-26');
  const ttsSpillEnd = addDays(phase2Start_forTTS, 13); // Faz 2'nin ilk 2 haftasına taşabilsin
  while (cursor <= ttsSpillEnd && orderIdx < ttsOrder.length) {
    const key = fmtDate(cursor);
    if (isWorkableEvening(key)) {
      const ord = ttsOrder[orderIdx];
      const lesson = LESSON_BY_TAG[ord.tag];
      days[key].evening.push(makeTask({
        kind: 'tts',
        lesson: ord.tag,
        title: `TTS — ${lesson.name}`,
        hours: 4,
        color: lesson.color,
        partIdx, partTotal: ord.days,
      }));
      remaining--;
      partIdx++;
      if (remaining === 0) {
        orderIdx++;
        partIdx = 1;
        if (orderIdx < ttsOrder.length) remaining = ttsOrder[orderIdx].days;
      }
    }
    cursor = addDays(cursor, 1);
  }

  // Pazar — LIGHT GÜN: Klinik deneme 100 soru (2h çözüm + 2h analiz) = 4h toplam
  cursor = new Date(phase1Start);
  while (cursor <= phase1End) {
    if (isSunday(cursor)) {
      const key = fmtDate(cursor);
      const day = days[key];
      if (day && day.morning.length === 0 && day.evening.length === 0) {
        day.morning.push(makeTask({ kind: 'deneme', title: 'Klinik Deneme (100 soru)', hours: 2, color: '#FFD166' }));
        day.evening.push(makeTask({ kind: 'deneme', title: 'Deneme Analizi', hours: 2, color: '#FFD166' }));
        day.note = 'LIGHT GÜN · 4h';
      }
    }
    cursor = addDays(cursor, 1);
  }

  // İSG hazırlık akşamları (6-12 May akşam İSG 4h, 13-15 May tam İSG 8h)
  let d = new Date(isgPrepStart);
  while (d <= isgPrepEnd) {
    const key = fmtDate(d);
    const day = days[key];
    if (day) {
      if (d >= isgFullStart) {
        day.morning = [makeTask({ kind: 'exam-prep', title: 'İSG Hazırlık — Tam Gün', hours: 6, color: '#FFB84D' })];
        day.evening = [];
      } else {
        day.evening = [makeTask({ kind: 'exam-prep', title: 'İSG Hazırlık', hours: 4, color: '#FFB84D' })];
      }
    }
    d = addDays(d, 1);
  }

  // ---- FAZ 2 — Tekrar (23 Haziran – 26 Temmuz, 30 gün. Kıbrıs içinde) ----
  // Sabah: Speetus kitapları okuma, 2 gün x 4h per ders, 9 ders = 18 gün
  // Akşam: Dahiliye vaka (7-8 gün) + Pediatri vaka (7-8 gün)
  // + Çıktı Çıkacak kampı 7 gün (TTS tekrarı)
  const phase2Start = parseDate('2026-06-23');
  const phase2End   = parseDate('2026-07-26');

  // Kitap okuma sırası — 9 normal ders (Dahiliye ve Pediatri vakaya ayrıldı)
  const bookOrder = [
    'PATO', 'MIK', 'FARM', 'BK', 'KHD', 'GC', 'ANAT', 'KS', 'FIZ'
  ];
  // Her biri 2 gün, toplam 18 gün sabah
  cursor = new Date(phase2Start);
  let bIdx = 0, bRem = 2, bPart = 1;
  while (cursor <= phase2End && bIdx < bookOrder.length) {
    const key = fmtDate(cursor);
    const day = days[key];
    if (day && day.morning.length === 0 && !isSunday(cursor)) {
      const tag = bookOrder[bIdx];
      const lesson = LESSON_BY_TAG[tag];
      day.morning.push(makeTask({
        kind: 'book', lesson: tag,
        title: `Speetus Kitap — ${lesson.name}`,
        hours: 4, color: lesson.color,
        partIdx: bPart, partTotal: 2,
      }));
      bRem--; bPart++;
      if (bRem === 0) { bIdx++; bRem = 2; bPart = 1; }
    }
    cursor = addDays(cursor, 1);
  }

  // Akşamlar: TTS spill (~7 g) + Dahiliye vaka 6 + Pediatri vaka 7 + Çıktı Çıkacak 5 = 18
  // Not: TTS spill Faz 1 TTS döngüsü tarafından dolduruldu. Aşağıdaki eveningPlan
  // kalan boş akşamları dolduracak.
  const eveningPlan = [
    { tag: 'DAH', kind: 'vaka', title: 'Dahiliye Vaka Kitabı', count: 6 },
    { tag: 'PED', kind: 'vaka', title: 'Pediatri Vaka Kitabı', count: 7 },
    { tag: null,  kind: 'cikti', title: 'Çıktı-Çıkacak Kampı', count: 5, color: '#E879A6' },
  ];
  cursor = new Date(phase2Start);
  let eIdx = 0, eRem = eveningPlan[0].count, ePart = 1;
  while (cursor <= phase2End && eIdx < eveningPlan.length) {
    const key = fmtDate(cursor);
    const day = days[key];
    if (day && day.evening.length === 0 && !isSunday(cursor)) {
      const item = eveningPlan[eIdx];
      const color = item.color || (item.tag ? LESSON_BY_TAG[item.tag].color : '#E879A6');
      day.evening.push(makeTask({
        kind: item.kind, lesson: item.tag || undefined,
        title: item.title, hours: 4, color,
        partIdx: ePart, partTotal: item.count,
      }));
      eRem--; ePart++;
      if (eRem === 0) { eIdx++; ePart = 1; if (eIdx < eveningPlan.length) eRem = eveningPlan[eIdx].count; }
    }
    cursor = addDays(cursor, 1);
  }

  // Faz 2 Pazar — LIGHT GÜN
  cursor = new Date(phase2Start);
  while (cursor <= phase2End) {
    if (isSunday(cursor)) {
      const key = fmtDate(cursor);
      const day = days[key];
      if (day && day.morning.length === 0 && day.evening.length === 0) {
        day.morning.push(makeTask({ kind: 'deneme', title: 'Klinik Deneme (100 soru)', hours: 2, color: '#FFD166' }));
        day.evening.push(makeTask({ kind: 'deneme', title: 'Deneme Analizi', hours: 2, color: '#FFD166' }));
        day.note = 'LIGHT GÜN · 4h';
      }
    }
    cursor = addDays(cursor, 1);
  }

  // ---- FAZ 3 — Son Ay (27 Temmuz – 25 Ağustos, 30 gün) ----
  // 3A: 6 temel ders x 3 gün = 18 gün sabah
  // 3B: Klinik (GC, KHD, KS) 3 günx5h = 9 gün akşam
  // 3C: Dahiliye 4 + Pediatri 5 = 9 gün akşam
  // Son 12 gün: sabah = Pato/Mikro/Farma/BK 3er gün, akşam = Çıktı çıkacak 7 gün + Fizyo 2 + Anatomi 2 + 1 buffer
  const phase3Start = parseDate('2026-07-27');
  const phase3End   = parseDate('2026-08-25');

  // İlk 16 workday sabah — temel son tekrar (6 ders: PATO/MIK/FARM/BK 3er gün, ANAT/FIZ 2şer gün = 12+4 = 16)
  const basicOrder = [
    { tag: 'PATO', days: 3 }, { tag: 'MIK', days: 3 },
    { tag: 'FARM', days: 3 }, { tag: 'BK', days: 3 },
    { tag: 'ANAT', days: 2 }, { tag: 'FIZ',  days: 2 },
  ];
  cursor = new Date(phase3Start);
  bIdx = 0; bRem = basicOrder[0].days; let basicPart = 1;
  let daysAssigned = 0;
  while (cursor <= phase3End && bIdx < basicOrder.length && daysAssigned < 16) {
    const key = fmtDate(cursor);
    const day = days[key];
    if (day && day.morning.length === 0 && !isSunday(cursor)) {
      const ord = basicOrder[bIdx];
      const lesson = LESSON_BY_TAG[ord.tag];
      day.morning.push(makeTask({
        kind: 'speetus', lesson: ord.tag,
        title: `Son Tekrar — ${lesson.name}`,
        hours: 5, color: lesson.color,
        partIdx: basicPart, partTotal: ord.days,
      }));
      bRem--; basicPart++;
      daysAssigned++;
      if (bRem === 0) { bIdx++; basicPart = 1; if (bIdx < basicOrder.length) bRem = basicOrder[bIdx].days; }
    }
    cursor = addDays(cursor, 1);
  }

  // İlk 16 workday akşamı: 3B + 3C (GC 3 + KHD 3 + KS 2 + DAH 3 + PED 5 = 16)
  const p3Evening = [
    { tag: 'GC',  title: 'Klinik Tekrar — GC',  count: 3, kind: 'spot' },
    { tag: 'KHD', title: 'Klinik Tekrar — KHD', count: 3, kind: 'spot' },
    { tag: 'KS',  title: 'Klinik Tekrar — KS',  count: 2, kind: 'spot' },
    { tag: 'DAH', title: 'Dahiliye Vaka Tekrar', count: 3, kind: 'vaka' },
    { tag: 'PED', title: 'Pediatri Vaka Tekrar', count: 5, kind: 'vaka' },
  ];
  cursor = new Date(phase3Start);
  let pIdx = 0, pRem = p3Evening[0].count, eAssigned = 0, p3EvePart = 1;
  while (cursor <= phase3End && pIdx < p3Evening.length && eAssigned < 16) {
    const key = fmtDate(cursor);
    const day = days[key];
    if (day && day.evening.length === 0 && !isSunday(cursor)) {
      const item = p3Evening[pIdx];
      const lesson = LESSON_BY_TAG[item.tag];
      day.evening.push(makeTask({
        kind: item.kind, lesson: item.tag,
        title: item.title, hours: 5, color: lesson.color,
        partIdx: p3EvePart, partTotal: item.count,
      }));
      pRem--; p3EvePart++;
      eAssigned++;
      if (pRem === 0) { pIdx++; p3EvePart = 1; if (pIdx < p3Evening.length) pRem = p3Evening[pIdx].count; }
    }
    cursor = addDays(cursor, 1);
  }

  // Son 12 gün sabah — 10 workday: PATO 3, MIK 3, FARM 2, BK 2 = 10
  const last12Basic = [
    { tag: 'PATO', days: 3 }, { tag: 'MIK', days: 3 },
    { tag: 'FARM', days: 2 }, { tag: 'BK', days: 2 },
  ];
  let last12Start = null;
  last12Start = parseDate('2026-08-14');
  cursor = new Date(last12Start);
  bIdx = 0; bRem = last12Basic[0].days; let last12Part = 1;
  while (cursor <= phase3End && bIdx < last12Basic.length) {
    const key = fmtDate(cursor);
    const day = days[key];
    if (day && !isSunday(cursor)) {
      const ord = last12Basic[bIdx];
      const lesson = LESSON_BY_TAG[ord.tag];
      day.morning = [makeTask({
        kind: 'spot', lesson: ord.tag,
        title: `Son Rötüş — ${lesson.name}`,
        hours: 5, color: lesson.color,
        partIdx: last12Part, partTotal: ord.days,
      })];
      bRem--; last12Part++;
      if (bRem === 0) { bIdx++; last12Part = 1; if (bIdx < last12Basic.length) bRem = last12Basic[bIdx].days; }
    }
    cursor = addDays(cursor, 1);
  }

  // Son 12 gün akşam: 10 workday — Çıktı Çıkacak 6 + FIZ 2 + ANAT 1 + Buffer 1 = 10
  const last12Eve = [
    { title: 'Çıktı-Çıkacak Kampı', count: 6, color: '#E879A6', kind: 'cikti' },
    { tag: 'FIZ', title: 'Fizyo — Şekil/Tablo', count: 2, kind: 'spot' },
    { tag: 'ANAT', title: 'Anatomi — Görsel/Tablo', count: 1, kind: 'spot' },
    { title: 'Buffer / Spot Defter', count: 1, color: '#8DA9C4', kind: 'spot' },
  ];
  cursor = new Date(last12Start);
  pIdx = 0; pRem = last12Eve[0].count; let last12EvePart = 1;
  while (cursor <= phase3End && pIdx < last12Eve.length) {
    const key = fmtDate(cursor);
    const day = days[key];
    if (day && !isSunday(cursor)) {
      const item = last12Eve[pIdx];
      const color = item.color || (item.tag ? LESSON_BY_TAG[item.tag].color : '#8DA9C4');
      day.evening = [makeTask({
        kind: item.kind, lesson: item.tag,
        title: item.title, hours: 5, color,
        partIdx: last12EvePart, partTotal: item.count,
      })];
      pRem--; last12EvePart++;
      if (pRem === 0) { pIdx++; last12EvePart = 1; if (pIdx < last12Eve.length) pRem = last12Eve[pIdx].count; }
    }
    cursor = addDays(cursor, 1);
  }

  // Faz 3 Pazar — LIGHT GÜN (son 3 hafta mini deneme ile hafifletilmiş, zaten light)
  cursor = new Date(phase3Start);
  while (cursor <= phase3End) {
    if (isSunday(cursor)) {
      const key = fmtDate(cursor);
      const day = days[key];
      if (day) {
        const toTUS = daysBetween(cursor, parseDate('2026-08-26'));
        if (toTUS <= 7) {
          day.morning.push(makeTask({ kind: 'deneme', title: 'Mini Deneme (60 soru)', hours: 2, color: '#FFD166' }));
          day.evening.push(makeTask({ kind: 'spot', title: 'Spot Defter + Kritik Anki', hours: 2, color: '#8DA9C4' }));
        } else {
          day.morning.push(makeTask({ kind: 'deneme', title: 'Klinik Deneme (100 soru)', hours: 2, color: '#FFD166' }));
          day.evening.push(makeTask({ kind: 'deneme', title: 'Deneme Analizi', hours: 2, color: '#FFD166' }));
        }
        day.note = 'LIGHT GÜN · 4h';
      }
    }
    cursor = addDays(cursor, 1);
  }

  // ---- Kıbrıs Telafi (17-20 Tem ~32h kayıp) ----
  // 1) Önceki 2 Pazar (5 Tem, 12 Tem) light yerine tam 8h — telafi +8h x 2 = 16h
  // 2) 13-16 Tem (Pzt-Per) +1h/gün sabah (→ 5h) ve +1h/gün akşam (→5h) = +8h
  // 3) 6-10 Tem (Pzt-Cum) sabah +1h = +5h  → toplam +29h ≈ 32h kayıp
  ['2026-07-05','2026-07-12'].forEach(k => {
    const day = days[k];
    if (!day) return;
    day.morning = [makeTask({ kind: 'deneme', title: 'Kıbrıs Telafi — Tam Deneme Çözüm', hours: 4, color: '#E0A868' })];
    day.evening = [makeTask({ kind: 'deneme', title: 'Kıbrıs Telafi — Deneme Analizi', hours: 4, color: '#E0A868' })];
    day.note = 'KIBRIS TELAFİ · 8h';
  });
  ['2026-07-13','2026-07-14','2026-07-15','2026-07-16'].forEach(k => {
    const day = days[k];
    if (!day) return;
    day.morning.forEach(t => { if (!t.locked) { t.hours = 5; t.note = '+1h telafi'; } });
    day.evening.forEach(t => { if (!t.locked) { t.hours = 5; t.note = '+1h telafi'; } });
    day.note = 'KIBRIS ÖNCESİ · 10h · efor+';
  });
  ['2026-07-06','2026-07-07','2026-07-08','2026-07-09','2026-07-10'].forEach(k => {
    const day = days[k];
    if (!day) return;
    day.morning.forEach(t => { if (!t.locked) t.hours = 5; });
    day.note = (day.note ? day.note + ' · ' : '') + 'efor+1h';
  });

  // ---- Buffer günleri (yakalama) ----
  // Faz 1 sonu: 22 Haz Pzt — eksik kalanı tamamla
  // Faz 2 sonu: 25-26 Tem Cmt/Paz — eksik kalanı tamamla
  [
    { k: '2026-06-22', label: 'Faz 1 Yakalama' },
    { k: '2026-07-25', label: 'Faz 2 Yakalama' },
    { k: '2026-07-26', label: 'Faz 2 Yakalama' },
  ].forEach(({k, label}) => {
    const day = days[k];
    if (!day) return;
    day.morning = [makeTask({ kind: 'spot', title: `${label} — Eksik Tamamla`, hours: 4, color: '#B0C4B1' })];
    day.evening = [makeTask({ kind: 'spot', title: `${label} — Zayıf Konu Tekrar`, hours: 4, color: '#B0C4B1' })];
    day.note = (day.note ? day.note + ' · ' : '') + 'BUFFER';
  });

  // TUS günü
  days['2026-08-26'].morning = [makeTask({ kind: 'tus', title: '🎯 TUS 2026', hours: 0, locked: true, color: '#E06B6B' })];
  days['2026-08-26'].evening = [];

  return { days, phases: PHASES };
}

// Kanban için tüm taskları düzleştir
function allTasks(days) {
  const out = [];
  for (const k of Object.keys(days).sort()) {
    const d = days[k];
    for (const t of d.morning) out.push({ ...t, date: k, slot: 'morning' });
    for (const t of d.evening) out.push({ ...t, date: k, slot: 'evening' });
  }
  return out;
}

Object.assign(window, {
  PLAN_START, TUS_DATE, LESSONS, LESSON_BY_TAG, LESSON_NOTES, FIXED_EVENTS,
  fmtDate, parseDate, addDays, daysBetween, isSunday,
  uid, makeTask, generateSkeleton, allTasks,
});
