import { Router, Request, Response } from 'express';
import { readFile, readdir } from 'fs/promises';
import { join } from 'path';

const router = Router();
const BASE = '/home/administrator/learning-101';

// ── Parse progress.md into structured data ──
function parseProgress(md: string) {
  const lines = md.split('\n');

  // Extract current status
  const lastCompleted = lines.find(l => l.includes('Last completed module'))?.replace(/.*\*\*:\s*/, '').replace(/\*\*/g, '').trim() || '';
  const nextUp = lines.find(l => l.includes('Next up'))?.replace(/.*\*\*:\s*/, '').replace(/\*\*/g, '').trim() || '';
  const lastSession = lines.find(l => l.includes('Last session date'))?.replace(/.*\*\*:\s*/, '').replace(/\*\*/g, '').trim() || '';

  // Parse module table
  const modules: any[] = [];
  const tableLines = lines.filter(l => /^\|\s*\d{2}/.test(l));
  for (const line of tableLines) {
    const cols = line.split('|').map(c => c.trim()).filter(Boolean);
    if (cols.length >= 4) {
      const num = cols[0];
      const name = cols[1];
      const rawStatus = cols[2].replace(/\*\*/g, '');
      const date = cols[3] === '—' ? null : cols[3];
      const notesFile = cols[4] === '—' ? null : cols[4]?.replace(/`/g, '');

      let status = 'pending';
      if (rawStatus === 'DONE') status = 'done';
      else if (rawStatus === 'UP NEXT') status = 'next';

      // Determine phase
      const n = parseInt(num);
      let phase = '';
      if (n <= 5) phase = 'The Basics';
      else if (n <= 10) phase = 'Understanding Our System';
      else if (n <= 14) phase = 'The Products';
      else if (n <= 18) phase = 'Reading & Writing Code';
      else phase = 'Hands-On Confidence';

      modules.push({
        number: num,
        name,
        status,
        dateCompleted: date,
        notesFile,
        phase,
        slideUrl: `/module-${num}.html`,
      });
    }
  }

  // Parse takeaways
  const takeaways: string[] = [];
  let inTakeaways = false;
  for (const line of lines) {
    if (line.includes('Key Takeaways')) { inTakeaways = true; continue; }
    if (inTakeaways && line.startsWith('- ')) {
      takeaways.push(line.replace(/^- /, ''));
    }
  }

  const doneCount = modules.filter(m => m.status === 'done').length;

  return {
    lastCompleted,
    nextUp,
    lastSession,
    modules,
    takeaways,
    stats: {
      total: modules.length,
      done: doneCount,
      percent: Math.round((doneCount / modules.length) * 100),
    },
  };
}

// GET /progress — curriculum + progress data
router.get('/progress', async (_req: Request, res: Response) => {
  try {
    const md = await readFile(join(BASE, 'progress.md'), 'utf-8');
    const data = parseProgress(md);
    res.json(data);
  } catch (err: any) {
    res.status(500).json({ error: err.message });
  }
});

// GET /questions — all questions asked
router.get('/questions', async (_req: Request, res: Response) => {
  try {
    const raw = await readFile(join(BASE, 'questions.json'), 'utf-8');
    const questions = JSON.parse(raw);
    res.json(questions);
  } catch (err: any) {
    if (err.code === 'ENOENT') { res.json([]); return; }
    res.status(500).json({ error: err.message });
  }
});

// GET /notes/:module — get notes for a module (e.g., "01")
router.get('/notes/:module', async (req: Request, res: Response) => {
  try {
    const mod = Array.isArray(req.params.module) ? req.params.module[0] : req.params.module;
    const filename = `module-${mod}-notes.md`;
    const content = await readFile(join(BASE, filename), 'utf-8');
    res.json({ module: mod, content });
  } catch (err: any) {
    if (err.code === 'ENOENT') { res.json({ module: req.params.module, content: null }); return; }
    res.status(500).json({ error: err.message });
  }
});

// GET /available-notes — list which module note files exist
router.get('/available-notes', async (_req: Request, res: Response) => {
  try {
    const files = await readdir(BASE);
    const noteFiles = files
      .filter(f => f.match(/^module-\d+-notes\.md$/))
      .map(f => {
        const match = f.match(/module-(\d+)-notes\.md/);
        return match ? match[1] : null;
      })
      .filter(Boolean);
    res.json(noteFiles);
  } catch (err: any) {
    res.status(500).json({ error: err.message });
  }
});

export default router;
