import { Request, Response } from 'express';
import fs from 'fs';
import path from 'path';

export class QuordleController {
  public async getAnswers(req: Request, res: Response): Promise<void> {
    try {
      const today = new Date();
      const dateStr = today.toISOString().split('T')[0];
      const baseDate = new Date('2025-06-28');
      const baseId = 1251;
      const offset = Math.floor(
        (today.getTime() - baseDate.getTime()) / (1000 * 60 * 60 * 24)
      );
      const calculatedQuordleId = baseId + offset;

      // 1️⃣ Check if already generated today on disk (cache)
      const baseDir = path.join(__dirname, '..', '..', '..');
      const candidateFiles = [
        path.join(baseDir, 'project', 'public', 'hints', 'qourdle', `${dateStr}.json`),
        path.join(baseDir, 'project', 'public', 'hints', 'quordle', `${dateStr}.json`),
        path.join(baseDir, 'project', 'dist', 'client', 'hints', 'qourdle', `${dateStr}.json`),
        path.join(baseDir, 'nytsolvers', 'dist', 'client', 'hints', 'qourdle', `${dateStr}.json`),
        `/var/www/nytsolvers/dist/client/hints/qourdle/${dateStr}.json`,
        `/var/www/project/dist/client/hints/qourdle/${dateStr}.json`,
      ];
      for (const f of candidateFiles) {
        if (fs.existsSync(f)) {
          try {
            const data = JSON.parse(fs.readFileSync(f, 'utf-8'));
            if (data && Array.isArray(data.answers) && data.answers.length === 4) {
              res.json(data);
              return;
            }
          } catch (_) {}
        }
      }

      // 2️⃣ Fetch fresh from Beebom
      const out = {
        date: dateStr,
        id: calculatedQuordleId,
        answers: [] as string[],
        source: 'https://beebom.com/puzzle/quordle-hints-answers-today/',
      };

      try {
        const controller = new AbortController();
        const timeoutId = setTimeout(() => controller.abort(), 8000);
        const r = await fetch(out.source, {
          headers: {
            'User-Agent':
              'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
            Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
          },
          signal: controller.signal,
        });
        clearTimeout(timeoutId);

        if (r.ok) {
          const html = await r.text();
          const schemaMatch = html.match(
            /puzzle\s*#?(\d+)[^]+?is\s*<strong[^>]*>([A-Za-z]{5})<\\?\/strong>[^<]+<strong[^>]*>([A-Za-z]{5})<\\?\/strong>[^<]+<strong[^>]*>([A-Za-z]{5})<\\?\/strong>[^<]+<strong[^>]*>([A-Za-z]{5})<\\?\/strong>/i
          );
          if (schemaMatch) {
            const parsedId = parseInt(schemaMatch[1], 10);
            if (!isNaN(parsedId)) out.id = parsedId;
            out.answers = [
              schemaMatch[2].toUpperCase(),
              schemaMatch[3].toUpperCase(),
              schemaMatch[4].toUpperCase(),
              schemaMatch[5].toUpperCase(),
            ];
          }
        }
      } catch (err: any) {
        console.warn(`[QuordleController] Beebom fetch error: ${err.message}`);
      }

      if (out.answers.length === 4) {
        res.json(out);
        return;
      }

      res.status(500).json({
        ...out,
        error: 'Classic answers not found – page structure may have changed',
      });
    } catch (error: any) {
      console.error('Error getting Quordle answers:', error.message);
      res.status(500).json({ error: 'Error getting Quordle answers' });
    }
  }
}
