<?php

declare(strict_types=1);

namespace App\Services;

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

class MailService
{
    private function createMailer(): PHPMailer
    {
        $mail = new PHPMailer(true);
        $mail->isSMTP();
        $mail->Host       = $_ENV['SMTP_HOST'] ?? 'ssl0.ovh.net';
        $mail->SMTPAuth   = true;
        $mail->Username   = $_ENV['SMTP_USER'] ?? '';
        $mail->Password   = $_ENV['SMTP_PASS'] ?? '';
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $mail->Port       = (int)($_ENV['SMTP_PORT'] ?? 587);
        $mail->CharSet    = 'UTF-8';
        $mail->setFrom(
            $_ENV['SMTP_FROM'] ?? 'noreply@mykollector.com',
            $_ENV['SMTP_FROM_NAME'] ?? 'MyKollectOr'
        );
        return $mail;
    }

    private function send(string $to, string $toName, string $subject, string $body): bool
    {
        try {
            $mail = $this->createMailer();
            $mail->addAddress($to, $toName);
            $mail->isHTML(true);
            $mail->Subject = $subject;
            $mail->Body    = $this->wrapHtml($subject, $body);
            $mail->AltBody = strip_tags($body);
            $mail->send();
            return true;
        } catch (Exception $e) {
            error_log('[MailService] Erreur envoi vers ' . $to . ': ' . $e->getMessage());
            return false;
        }
    }

    private function wrapHtml(string $title, string $content): string
    {
        return <<<HTML
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<style>
  body { font-family: Arial, sans-serif; background:#f5f5f5; margin:0; padding:20px; }
  .container { max-width:600px; margin:0 auto; background:#fff; border-radius:8px; overflow:hidden; }
  .header { background:#070F18; padding:24px; text-align:center; }
  .header h1 { color:#C8A84B; margin:0; font-size:24px; }
  .body { padding:32px; color:#333; line-height:1.6; }
  .btn { display:inline-block; background:#C8A84B; color:#fff; text-decoration:none;
         padding:12px 24px; border-radius:6px; font-weight:bold; margin:16px 0; }
  .footer { background:#f5f5f5; padding:16px; text-align:center; font-size:12px; color:#888; }
</style>
</head>
<body>
<div class="container">
  <div class="header"><h1>MyKollectOr®</h1></div>
  <div class="body">{$content}</div>
  <div class="footer">MyKollectOr® — <a href="https://www.mykollector.com">www.mykollector.com</a></div>
</div>
</body>
</html>
HTML;
    }

    // ═══ EMAILS SPORTIFS ═══

    public function inscriptionSportif(string $email, string $prenom): bool
    {
        $body = "<h2>Bienvenue, {$prenom} !</h2>
        <p>Votre compte MyKollectOr est créé. Vous pouvez maintenant enregistrer vos exploits et commander vos médailles gravées.</p>
        <a href='https://chrono.mykollector.com' class='btn'>Accéder à mon espace</a>
        <p>Pour scanner un QR code sur une stèle, utilisez l'application chrono sur votre téléphone.</p>";
        return $this->send($email, $prenom, 'Bienvenue sur MyKollectOr !', $body);
    }

    public function chronoValide(string $email, string $prenom, string $parcours, string $dureeAffichage, string $lienBoutique): bool
    {
        $body = "<h2>Votre chrono est validé, {$prenom} !</h2>
        <p>Bravo pour votre exploit sur le <strong>{$parcours}</strong> !</p>
        <p style='font-size:32px;text-align:center;color:#C8A84B;'><strong>{$dureeAffichage}</strong></p>
        <p>Immortalisez cet exploit dans le métal — commandez votre médaille gravée.</p>
        <a href='{$lienBoutique}' class='btn'>Commander ma médaille</a>";
        return $this->send($email, $prenom, "Votre chrono {$parcours} est validé !", $body);
    }

    public function commandeEnGravure(string $email, string $prenom, string $texteGravure, string $refCommande, string $lienValidation): bool
    {
        $body = "<h2>Confirmez votre texte de gravure</h2>
        <p>Bonjour {$prenom}, votre commande <strong>{$refCommande}</strong> est prête à être gravée.</p>
        <div style='background:#f0f0f0;border-left:4px solid #C8A84B;padding:16px;margin:16px 0;font-family:Courier New,monospace;'>
            {$texteGravure}
        </div>
        <p>Ce texte sera gravé sur votre médaille. Vérifiez l'orthographe avec soin.</p>
        <a href='{$lienValidation}' class='btn'>✅ Confirmer ce texte</a>
        <p><small>Ce lien expire dans 48h. Sans réponse, votre gravure sera lancée automatiquement sous 7 jours.</small></p>";
        return $this->send($email, $prenom, 'Confirmez votre texte de gravure — ' . $refCommande, $body);
    }

    public function relanceValidationJ3(string $email, string $prenom, string $texteGravure, string $refCommande, string $lienValidation): bool
    {
        $body = "<h2>[Rappel] Votre médaille attend votre accord</h2>
        <p>Bonjour {$prenom}, vous n'avez pas encore confirmé le texte de gravure de votre commande <strong>{$refCommande}</strong>.</p>
        <div style='background:#f0f0f0;border-left:4px solid #C8A84B;padding:16px;margin:16px 0;font-family:Courier New,monospace;'>
            {$texteGravure}
        </div>
        <a href='{$lienValidation}' class='btn'>✅ Confirmer maintenant</a>
        <p><small>Sans confirmation dans 4 jours, votre gravure sera lancée automatiquement.</small></p>";
        return $this->send($email, $prenom, '[Rappel] Votre médaille attend votre accord — ' . $refCommande, $body);
    }

    public function autoValidationJ7(string $email, string $prenom, string $texteGravure, string $refCommande): bool
    {
        $body = "<h2>Votre gravure a été lancée automatiquement</h2>
        <p>Bonjour {$prenom}, n'ayant pas reçu votre confirmation, votre commande <strong>{$refCommande}</strong> est partie en gravure.</p>
        <div style='background:#f0f0f0;border-left:4px solid #C8A84B;padding:16px;margin:16px 0;font-family:Courier New,monospace;'>
            {$texteGravure}
        </div>
        <p>Vous recevrez un email dès l'expédition avec le numéro de suivi.</p>";
        return $this->send($email, $prenom, 'Votre gravure a été lancée — ' . $refCommande, $body);
    }

    public function expeditionConfirmee(string $email, string $prenom, string $refCommande, string $transporteur, string $numeroSuivi): bool
    {
        $body = "<h2>Votre médaille est en route ! 🎉</h2>
        <p>Bonjour {$prenom}, votre commande <strong>{$refCommande}</strong> a été expédiée.</p>
        <p><strong>Transporteur :</strong> {$transporteur}</p>
        " . ($numeroSuivi ? "<p><strong>Numéro de suivi :</strong> {$numeroSuivi}</p>" : '') . "
        <p>Votre exploit sera bientôt dans vos mains. Merci de votre confiance !</p>";
        return $this->send($email, $prenom, 'Votre médaille est en route ! — ' . $refCommande, $body);
    }

    public function rejetCommande(string $email, string $prenom, string $refCommande, string $motif): bool
    {
        $body = "<h2>[SAV] Problème avec votre commande {$refCommande}</h2>
        <p>Bonjour {$prenom}, un problème a été signalé sur votre commande.</p>
        <p><strong>Motif :</strong> {$motif}</p>
        <p>Notre équipe vous contactera très prochainement pour trouver une solution.</p>
        <p>Vous pouvez aussi nous écrire à : <a href='mailto:julien@mykollector.com'>julien@mykollector.com</a></p>";
        return $this->send($email, $prenom, "[SAV] Problème avec votre commande {$refCommande}", $body);
    }

    public function relanceChronoJ7(string $email, string $prenom, string $parcours, string $lienBoutique): bool
    {
        $body = "<h2>Votre chrono vous attend, {$prenom} !</h2>
        <p>Vous avez réalisé le <strong>{$parcours}</strong> il y a 7 jours. Votre exploit mérite d'être immortalisé.</p>
        <a href='{$lienBoutique}' class='btn'>Commander ma médaille maintenant</a>";
        return $this->send($email, $prenom, "Votre chrono vous attend ! — {$parcours}", $body);
    }

    public function relanceChronoJ30(string $email, string $prenom, string $parcours, string $lienBoutique): bool
    {
        $body = "<h2>Immortalisez votre exploit, {$prenom}</h2>
        <p>Il y a un mois, vous avez gravi le <strong>{$parcours}</strong>. C'est un exploit qui mérite une médaille gravée.</p>
        <a href='{$lienBoutique}' class='btn'>Commander ma médaille</a>";
        return $this->send($email, $prenom, "Immortalisez votre exploit — {$parcours}", $body);
    }

    public function relanceChronoJ60(string $email, string $prenom, string $parcours, string $lienBoutique): bool
    {
        $body = "<h2>Dernière chance, {$prenom}</h2>
        <p>Votre exploit sur le <strong>{$parcours}</strong> mérite d'être gravé dans le métal. N'attendez plus.</p>
        <a href='{$lienBoutique}' class='btn'>Commander ma médaille</a>";
        return $this->send($email, $prenom, "Dernière chance — votre exploit mérite mieux — {$parcours}", $body);
    }

    public function resetMotDePasse(string $email, string $prenom, string $lienReset): bool
    {
        $body = "<h2>Réinitialisation de votre mot de passe</h2>
        <p>Bonjour {$prenom}, vous avez demandé la réinitialisation de votre mot de passe.</p>
        <a href='{$lienReset}' class='btn'>Réinitialiser mon mot de passe</a>
        <p><small>Ce lien expire dans 1 heure. Si vous n'êtes pas à l'origine de cette demande, ignorez cet email.</small></p>";
        return $this->send($email, $prenom, 'Réinitialisation de votre mot de passe MyKollectOr', $body);
    }

    // ═══ EMAILS FABRICANT ═══

    public function accesFabCree(string $email, string $prenom, string $motDePasse): bool
    {
        $body = "<h2>Vos accès MyKollectOr Fabricant</h2>
        <p>Bonjour {$prenom}, votre compte a été créé.</p>
        <p><strong>Email :</strong> {$email}</p>
        <p><strong>Mot de passe provisoire :</strong> {$motDePasse}</p>
        <a href='https://fab.mykollector.com' class='btn'>Accéder au portail fabricant</a>
        <p><small>Changez votre mot de passe à la première connexion.</small></p>";
        return $this->send($email, $prenom, 'Vos accès MyKollectOr Fabricant', $body);
    }

    // ═══ EMAILS ADMIN ═══

    public function stockBas(string $article, string $fabricant, int $quantite, int $seuil): bool
    {
        $adminEmail = $_ENV['SMTP_USER'] ?? 'julien@mykollector.com';
        $body = "<h2>[Alerte] Stock bas</h2>
        <p><strong>Article :</strong> {$article}</p>
        <p><strong>Fabricant :</strong> {$fabricant}</p>
        <p><strong>Stock actuel :</strong> {$quantite} (seuil : {$seuil})</p>
        <a href='https://fab.mykollector.com/admin/config.html' class='btn'>Gérer les stocks</a>";
        return $this->send($adminEmail, 'Admin MKO', "[Alerte] Stock bas — {$fabricant}", $body);
    }

    public function erreurImportPS(string $refCommande, string $erreur): bool
    {
        $adminEmail = $_ENV['SMTP_USER'] ?? 'julien@mykollector.com';
        $body = "<h2>[Alerte] Import PS en échec</h2>
        <p><strong>Commande :</strong> {$refCommande}</p>
        <p><strong>Erreur :</strong> {$erreur}</p>
        <a href='https://fab.mykollector.com/admin/prestashop.html' class='btn'>Vérifier la connexion PS</a>";
        return $this->send($adminEmail, 'Admin MKO', '[Alerte] Import PS en échec — vérifier', $body);
    }

    public function agentSilence(string $atelierNom, int $minutesSilence): bool
    {
        $adminEmail = $_ENV['SMTP_USER'] ?? 'julien@mykollector.com';
        $body = "<h2>[Alerte] Agent DXF inactif</h2>
        <p><strong>Atelier :</strong> {$atelierNom}</p>
        <p><strong>Silence depuis :</strong> {$minutesSilence} minutes</p>
        <p>L'agent DXF ne répond plus. Vérifiez que le logiciel tourne sur le PC fabricant.</p>
        <a href='https://fab.mykollector.com/agent/' class='btn'>Vérifier les agents</a>";
        return $this->send($adminEmail, 'Admin MKO', "[Alerte] Agent DXF inactif — {$atelierNom}", $body);
    }

    public function backupDropboxErreur(string $erreur): bool
    {
        $adminEmail = $_ENV['SMTP_USER'] ?? 'julien@mykollector.com';
        $body = "<h2>[Alerte] Backup Dropbox en échec</h2>
        <p><strong>Erreur :</strong> {$erreur}</p>
        <p>Le backup hebdomadaire vers Dropbox a échoué. Vérifiez le token dans la configuration.</p>
        <a href='https://fab.mykollector.com/admin/config-backup.html' class='btn'>Configurer Dropbox</a>";
        return $this->send($adminEmail, 'Admin MKO', '[Alerte] Backup Dropbox en échec', $body);
    }
}
