import cron from 'node-cron';
import knex from './db/knex';
import { Model } from 'objection';
import { generateContent } from './scripts/content-generator';
import { generateSettings } from './scripts/settings-generator';
import { generateConexoHints } from './scripts/conexo-generator';
import { generateCrosswordHints } from './scripts/crossword-generator';
import { generateQuordleHints } from './scripts/quordle-generator';
import { generateConnectionsHints } from './scripts/connections-generator';
import { generateStrandsHints } from './scripts/strands-generator';
import { generateWordleHints } from './scripts/wordle-generator';
import { generateSpellingBeeHints } from './scripts/spellingbee-generator';
import { generateMiniCrosswordHints } from './scripts/minicrossword-generator';
import { generateLetterBoxedHints } from './scripts/letterboxed-generator';
import { generatePipsHints } from './scripts/pips-generator';
import { generateSportsConnectionsHints } from './scripts/sports-connections-generator';
import { generateBlossomHints } from './scripts/blossom-generator';
import { generateBetweenleHints } from './scripts/betweenle-generator';
import { generateLatimesMiniCrosswordHints } from './scripts/latimesminicrossword-generator';
import { generateLaCrosswordHints } from './scripts/lacrossword-generator';
import { generateWordSaladHints } from './scripts/wordsalad-generator';
import { pingAllDailyPuzzlePages } from './services/indexingService';

Model.knex(knex);

// ---------------------------
// Lightweight jobs (every minute)
// ---------------------------
cron.schedule('* * * * *', async () => {
  console.log('Running content generation task...');
  await generateContent();
});

cron.schedule('* * * * *', async () => {
  console.log('Running settings generation task...');
  await generateSettings();
}, { timezone: 'Australia/Sydney' });

// -------------------------------------------
// HEAVY PUPPETEER JOBS — 5 MINUTE SPACING
// -------------------------------------------

// 00 minutes past the hour
cron.schedule('0 * * * *', async () => {
  console.log('Running Conexo hints generation...');
  await generateConexoHints();
}, { timezone: 'Australia/Sydney' });

// 05 minutes past the hour
cron.schedule('5 * * * *', async () => {
  console.log('Running Crossword hints generation...');
  await generateCrosswordHints();
}, { timezone: 'Australia/Sydney' });

// 10 minutes past the hour
cron.schedule('10 * * * *', async () => {
  console.log('Running Quordle hints generation...');
  await generateQuordleHints();
}, { timezone: 'Australia/Sydney' });

// 15 minutes past the hour
cron.schedule('15 * * * *', async () => {
  console.log('Running Connections hints generation...');
  await generateConnectionsHints();
}, { timezone: 'Australia/Sydney' });

// 20 minutes past the hour
cron.schedule('20 * * * *', async () => {
  console.log('Running Strands hints generation...');
  await generateStrandsHints();
}, { timezone: 'Australia/Sydney' });

// 25 minutes past the hour
cron.schedule('25 * * * *', async () => {
  console.log('Running Wordle hints generation...');
  await generateWordleHints();
}, { timezone: 'Australia/Sydney' });

// 30 minutes past the hour
cron.schedule('30 * * * *', async () => {
  console.log('Running Spelling Bee hints generation...');
  await generateSpellingBeeHints();
}, { timezone: 'Australia/Sydney' });

// 35 minutes past the hour
cron.schedule('35 * * * *', async () => {
  console.log('Running Mini Crossword hints generation...');
  await generateMiniCrosswordHints();
}, { timezone: 'Australia/Sydney' });

// 40 minutes past the hour
cron.schedule('40 * * * *', async () => {
  console.log('Running Letter Boxed hints generation...');
  await generateLetterBoxedHints();
}, { timezone: 'Australia/Sydney' });

// 45 minutes past the hour
cron.schedule('45 * * * *', async () => {
  console.log('Running Pips hints generation...');
  await generatePipsHints();
}, { timezone: 'Australia/Sydney' });

// 50 minutes past the hour
cron.schedule('50 * * * *', async () => {
  console.log('Running Sports Connections hints generation...');
  await generateSportsConnectionsHints();
}, { timezone: 'Australia/Sydney' });

// 55 minutes past the hour
cron.schedule('55 * * * *', async () => {
  console.log('Running Blossom hints generation...');
  await generateBlossomHints();
}, { timezone: 'Australia/Sydney' });

// Next hour: 00 minutes
cron.schedule('0 * * * *', async () => {
  console.log('Running Betweenle hints generation...');
  await generateBetweenleHints();
}, { timezone: 'Australia/Sydney' });

// +05 minutes
cron.schedule('5 * * * *', async () => {
  console.log('Running LA Times Mini Crossword hints generation...');
  await generateLatimesMiniCrosswordHints();
}, { timezone: 'Australia/Sydney' });

// +10 minutes
cron.schedule('10 * * * *', async () => {
  console.log('Running LA Times Crossword hints generation...');
  await generateLaCrosswordHints();
}, { timezone: 'Australia/Sydney' });

// +15 minutes
cron.schedule('15 * * * *', async () => {
  console.log('Running Word Salad hints generation...');
  await generateWordSaladHints();
}, { timezone: 'Australia/Sydney' });

// -------------------------------------------------------------
// DAILY SEARCH ENGINE INDEXING PING (Midnight New York Time)
// -------------------------------------------------------------
// Pings Google Indexing API & Bing IndexNow at 00:05 New York time
// when the daily date and puzzle dynamic title/metas roll over.
cron.schedule('5 0 * * *', async () => {
  console.log('⏰ [Daily Indexing] Running midnight ET search engine indexing ping for daily puzzle pages...');
  try {
    const summary = await pingAllDailyPuzzlePages();
    console.log(
      `[Daily Indexing] Midnight sync complete: ${summary.succeeded}/${summary.pinged} pages pinged (${summary.skipped} already cached).`
    );
  } catch (err: any) {
    console.error('[Daily Indexing] ✖ Error during midnight indexing ping:', err.message);
  }
}, { timezone: 'America/New_York' });

console.log("✅ Cron jobs scheduled with 5-minute gaps between each heavy task.");
