import Surreal from 'surrealdb';
import dotenv from 'dotenv';

// Charger les variables d'environnement
dotenv.config();

const db = new Surreal();

async function addScreenAvailability() {
  try {
    console.log("Connecting to SurrealDB...");
    console.log("URL:", process.env.SURREAL_URL);
    await db.connect(process.env.SURREAL_URL!, {
      namespace: process.env.SURREAL_NAMESPACE!,
      database: process.env.SURREAL_DATABASE!,
      auth: {
        username: process.env.SURREAL_USER!,
        password: process.env.SURREAL_PASS!
      }
    });
    console.log("Connected!");

    // D'abord, s'assurer que le champ unavailable_weeks est défini dans le schéma
    console.log("Defining unavailable_weeks field in schema...");
    await db.query(`DEFINE FIELD IF NOT EXISTS unavailable_weeks ON screen TYPE array<int> DEFAULT [] PERMISSIONS FULL`);
    await db.query(`DEFINE FIELD IF NOT EXISTS unavailable_weeks[*] ON screen TYPE int PERMISSIONS FULL`);
    console.log("Schema updated!");

    // Récupérer tous les écrans
    const [screens] = await db.query<any[]>(`SELECT id, name, unavailable_weeks FROM screen`);
    
    console.log(`Found ${screens?.length || 0} screens`);

    if (!screens || screens.length === 0) {
      console.log("No screens found");
      return;
    }

    // Générer des disponibilités aléatoires mais réalistes pour chaque écran
    // Certains écrans seront indisponibles sur certaines semaines
    for (let i = 0; i < screens.length; i++) {
      const screen = screens[i];
      const screenId = typeof screen.id === 'object' ? screen.id.id : screen.id.toString().replace('screen:', '');
      
      // Générer des semaines indisponibles aléatoires
      // Environ 30% des écrans auront des semaines indisponibles
      let unavailableWeeks: number[] = [];
      
      if (Math.random() < 0.4) {
        // Cet écran aura des semaines indisponibles
        // Générer entre 1 et 5 semaines indisponibles consécutives ou non
        const numUnavailable = Math.floor(Math.random() * 5) + 1;
        const startWeek = Math.floor(Math.random() * 10) + 5; // Entre semaine 5 et 14
        
        for (let j = 0; j < numUnavailable; j++) {
          const week = startWeek + j;
          if (!unavailableWeeks.includes(week) && week <= 52) {
            unavailableWeeks.push(week);
          }
        }
      }
      
      // Ajouter spécifiquement quelques écrans indisponibles sur les semaines 6-9
      // pour les tests (environ 20% des écrans)
      if (Math.random() < 0.25) {
        const weeksToAdd = [6, 7, 8, 9].filter(() => Math.random() < 0.6);
        weeksToAdd.forEach(w => {
          if (!unavailableWeeks.includes(w)) {
            unavailableWeeks.push(w);
          }
        });
      }
      
      // Trier les semaines
      unavailableWeeks = [...new Set(unavailableWeeks)].sort((a, b) => a - b);
      
      // Mettre à jour l'écran
      await db.query(`
        UPDATE type::thing("screen", $id) SET 
          unavailable_weeks = $weeks
      `, { 
        id: screenId,
        weeks: unavailableWeeks
      });
      
      const status = unavailableWeeks.length > 0 
        ? `indisponible semaines: ${unavailableWeeks.join(', ')}`
        : 'toujours disponible';
      console.log(`Updated screen ${screenId} (${screen.name}): ${status}`);
    }

    console.log("\n✅ All screens updated with availability data!");
    
    // Afficher un résumé
    const [summary] = await db.query<any[]>(`
      SELECT 
        count() as total,
        array::len(unavailable_weeks) as unavailable_count
      FROM screen
      GROUP ALL
    `);
    
    // Compter les écrans avec des indisponibilités
    const [withUnavailable] = await db.query<any[]>(`
      SELECT count() as count FROM screen WHERE array::len(unavailable_weeks) > 0
    `);
    
    console.log(`\nSummary:`);
    console.log(`- Total screens: ${screens.length}`);
    console.log(`- Screens with unavailable weeks: ${withUnavailable?.[0]?.count || 0}`);
    
    // Montrer quelques exemples
    const [examples] = await db.query<any[]>(`
      SELECT id, name, unavailable_weeks FROM screen 
      WHERE array::len(unavailable_weeks) > 0 
      LIMIT 10
    `);
    
    console.log(`\nExamples of screens with unavailable weeks:`);
    examples?.forEach((s: any) => {
      console.log(`  - ${s.name}: weeks ${s.unavailable_weeks.join(', ')}`);
    });

  } catch (error) {
    console.error("Error:", error);
  } finally {
    await db.close();
  }
}

addScreenAvailability();
