import puppeteer from 'puppeteer';
import * as fs from 'fs';
import * as path from 'path';
import { pingDailyPuzzleUpdated } from '../services/indexingService';
import { launchBrowser } from "./puppeteer-launcher";

export async function generateWordSaladHints() {
    console.log('Starting generateWordSaladHints...');
    const browser = await launchBrowser();
    const page = await browser.newPage();

    try {
        const URL = 'https://ladypuzzle.pro/word-salad-answers-today';
        await page.goto(URL, { waitUntil: 'networkidle2', timeout: 60000 });

        const data = await page.evaluate(() => {
            const result: { date: string; number: number; grid: string[][]; answers: string[] } = {
                date: '',
                number: 0,
                grid: [],
                answers: [],
            };

            // Extract number from h2
            const h2Elements = document.querySelectorAll('h2');
            for (const h2Element of h2Elements) {
                const text = h2Element.textContent || '';
                const match = text.match(/#(\d+)/);
                if (match) {
                    result.number = parseInt(match[1]);
                    break;
                }
            }

            // Extract grid from .puzzle-grid
            const gridSpans = document.querySelectorAll('.puzzle-grid span');
            const letters = Array.from(gridSpans).map(span => span.textContent?.trim() || '');
            // Assuming 4x4 grid
            result.grid = [];
            for (let i = 0; i < 4; i++) {
                result.grid.push(letters.slice(i * 4, (i + 1) * 4));
            }

            // Extract answers from .hint-visible p
            const answerElements = document.querySelectorAll('.hint-visible p');
            result.answers = Array.from(answerElements).map(p => p.textContent?.trim() || '');

            return result;
        });

        const date = new Date().toISOString().split('T')[0];
        data.date = date;

        const isProduction = process.env.NODE_ENV === 'production';
        const baseDir = path.join(__dirname, '..', '..', '..');
        const hintsDir = isProduction
            ? path.join(baseDir, 'nytsolvers', 'dist', 'client', 'hints', 'wordsalad')
            : path.join(baseDir, 'project', 'public', 'hints', 'wordsalad');

        if (!fs.existsSync(hintsDir)) {
            fs.mkdirSync(hintsDir, { recursive: true });
        }

        const filePath = path.join(hintsDir, `${date}.json`);
        fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf8');
        console.log(`Successfully generated Word Salad hints: ${filePath}`);

        // Trigger search engine indexing (Google Indexing API & Bing IndexNow)
        await pingDailyPuzzleUpdated('word-salad-hints', date).catch((err: any) =>
          console.error('[Word Salad] Error pinging search indexing:', err.message)
        );

    } catch (error) {
        console.error("Error in generateWordSaladHints:", error);
    } finally {
        await browser.close();
    }
    console.log('Finished generateWordSaladHints.');
};

// Run the function if this file is executed directly
if (require.main === module) {
    (async () => {
        await generateWordSaladHints();
    })();
}
