import mysql from 'mysql2/promise';
import dotenv from 'dotenv';
import { nanoid } from 'nanoid';

dotenv.config();

const FORGE_API_URL = process.env.BUILT_IN_FORGE_API_URL;
const FORGE_API_KEY = process.env.BUILT_IN_FORGE_API_KEY;
const BASE_URL = 'https://assoportail-eagcgspx.manus.space';

async function main() {
  const conn = await mysql.createConnection(process.env.DATABASE_URL);

  // 1. Submit request #2 (change status from brouillon to soumise)
  console.log('📝 Soumission de la demande #2...');
  await conn.execute(
    `UPDATE requests SET status = 'soumise', dateSubmission = NOW() WHERE id = 2`
  );
  console.log('  ✅ Demande #2 soumise avec succès');

  // 2. Get request details
  const [requests] = await conn.execute(
    `SELECT r.id, r.titre, r.type, r.status, r.montantDemande, r.description, r.dateSubmission, 
            a.nomAssociation, a.emailContact, a.ville
     FROM requests r 
     LEFT JOIN associations a ON r.associationId = a.id 
     WHERE r.id = 2`
  );

  const req = requests[0];
  console.log(`\n📨 Envoi de la notification pour: "${req.titre}"`);

  const typeLabels = {
    subvention_fonctionnement: 'Subvention de fonctionnement',
    subvention_projet: 'Subvention de projet',
    agrement_jeunesse_education: 'Agrément Jeunesse et Éducation Populaire',
    agrement_sport: 'Agrément Sport',
    autorisation_occupation: "Autorisation d'occupation",
    demande_salle: 'Demande de salle',
    autre: 'Autre demande',
  };

  // 3. Generate tokens
  const validateToken = nanoid(48);
  const refuseToken = nanoid(48);
  const expiresAt = new Date(Date.now() + 7 * 24 * 60 * 60 * 1000);

  await conn.execute(
    `INSERT INTO emailActionTokens (token, requestId, action, expiresAt, createdAt) VALUES (?, ?, 'validee', ?, NOW())`,
    [validateToken, req.id, expiresAt]
  );
  await conn.execute(
    `INSERT INTO emailActionTokens (token, requestId, action, expiresAt, createdAt) VALUES (?, ?, 'refusee', ?, NOW())`,
    [refuseToken, req.id, expiresAt]
  );

  console.log(`  🔑 Tokens créés (valides jusqu'au ${expiresAt.toLocaleDateString('fr-FR')})`);

  // 4. Build URLs
  const validateUrl = `${BASE_URL}/api/email-action/${validateToken}`;
  const refuseUrl = `${BASE_URL}/api/email-action/${refuseToken}`;
  const viewUrl = `${BASE_URL}/dashboard/requests/${req.id}`;

  const typeLabel = typeLabels[req.type] || req.type;

  // 5. Send notification
  const title = `📨 Nouvelle demande: ${req.titre}`;
  const content = `**Association:** ${req.nomAssociation || 'Non renseignée'}
**Ville:** ${req.ville || 'Non renseignée'}
**Type:** ${typeLabel}
**Description:** ${req.description || 'Non spécifiée'}

---

### Actions rapides

✅ [**VALIDER la demande**](${validateUrl})

❌ [**REFUSER la demande**](${refuseUrl})

🔍 [**Voir le détail**](${viewUrl})

---

_Ces liens sont valides pendant 7 jours (jusqu'au ${expiresAt.toLocaleDateString('fr-FR', { day: 'numeric', month: 'long', year: 'numeric' })})._`;

  const endpoint = FORGE_API_URL.endsWith('/')
    ? `${FORGE_API_URL}webdevtoken.v1.WebDevService/SendNotification`
    : `${FORGE_API_URL}/webdevtoken.v1.WebDevService/SendNotification`;

  try {
    const response = await fetch(endpoint, {
      method: 'POST',
      headers: {
        'accept': 'application/json',
        'authorization': `Bearer ${FORGE_API_KEY}`,
        'content-type': 'application/json',
        'connect-protocol-version': '1',
      },
      body: JSON.stringify({ title, content }),
    });

    if (response.ok) {
      console.log(`  ✅ Notification envoyée avec succès !`);
      console.log(`\n📋 Récapitulatif:`);
      console.log(`  - Demande: ${req.titre}`);
      console.log(`  - Association: ${req.nomAssociation}`);
      console.log(`  - Type: ${typeLabel}`);
      console.log(`  - Lien Valider: ${validateUrl}`);
      console.log(`  - Lien Refuser: ${refuseUrl}`);
      console.log(`  - Lien Voir: ${viewUrl}`);
    } else {
      const detail = await response.text();
      console.error(`  ❌ Échec: ${response.status} - ${detail}`);
    }
  } catch (error) {
    console.error(`  ❌ Erreur:`, error.message);
  }

  await conn.end();
  console.log('\n✅ Terminé !');
}

main().catch(console.error);
