<?php

namespace App\Services;

use App\Models\Link;
use App\Enums\NotificationStatus;
use App\Enums\LinkStatus;
use Illuminate\Support\Facades\Mail;
use GuzzleHttp\Client;
use App\Mail\DonateLinkMail;
use App\Mail\ThankMail;
use Illuminate\Support\Facades\Log;

class NotificationService
{
    protected Client $http;
    protected string $instanceId;

    public function __construct()
    {
        $instance = config('app.instance_id');
        $base     = rtrim(config('app.base_url'), '/') . '/' . trim($instance, '/') . '/';

        $this->http = new Client([
            'base_uri' => $base,
            'timeout'  => 5,
        ]);

        $this->instanceId = $instance;
    }

    public function sendEmail(Link $link): void
    {
        try {
            if ($email = $link->donateur->email) {
                Mail::to($email)
                    ->send(new DonateLinkMail($link));
                // Mettre à jour le statut sur le donateur
                $link->donateur->update(['statut_email' => NotificationStatus::Sent->value]);
                // Enregistrer aussi sur le lien
                $link->update(['email_status' => NotificationStatus::Sent]);
            }
        } catch (\Exception $e) {
            Log::error("Email sending failed for link {$link->id}: {$e->getMessage()}", ['link_id' => $link->id]);
            $link->donateur->update(['statut_email' => NotificationStatus::Failed->value]);
            $link->update(['email_status' => NotificationStatus::Failed]);
        }
    }

    public function sendWhatsapp(Link $link): void
    {
        try {
            $to = $link->donateur->telephone;
            if (empty($to)) {
                Log::warning("WhatsApp not sent: no phone number for link {$link->id}");
                $link->update(['whatsapp_status' => NotificationStatus::Failed]);
                return;
            }
            $titre  = $link->donateur->sexe === 'F' ? 'Chère' : 'Cher';
            
            $initiator = '';
            if ($link->campaign->initiator_name) {
                $initiator = "*{$link->campaign->initiator_name}*"
                        . ($link->campaign->initiator_position ? "\n{$link->campaign->initiator_position}" : '');
            }

            // Construction d'un message formaté professionnellement
            $body = "*{$link->campaign->name}*\n\n"
                 .  "$titre {$link->donateur->prenom} {$link->donateur->nom}, {$link->donateur->fonction}\n\n"
                 .  "{$link->campaign->message}\n\n"
                 .  "➡️ Cliquez ici pour faire votre don :\n\n"
                 .  "{$this->getLandingUrl($link)}\n\n"
                 .  "🙏 Merci de votre soutien.\n\n"
                 .  "{$initiator}";

            $payload = [
                'token' => config('app.token'),
                'to'    => $to,
            ];

              // Si une image de couverture est définie, on la passe aussi
            if ($link->campaign->cover_image) {
                //$imageUrl = "https://file-example.s3-accelerate.amazonaws.com/images/test.jpg";
                $imageUrl = asset('storage/' . $link->campaign->cover_image);
                $payload['image'] = $imageUrl;
                $payload['caption'] = $body;
                $this->http->post('messages/image', [
                    'form_params' => $payload,
                ]);
            }
            else{
                $payload['body'] = $body;
                $this->http->post('messages/chat', [
                    'form_params' => $payload,
                ]);
            }

            $link->update(['whatsapp_status' => NotificationStatus::Sent]);

        } catch (\Exception $e) {
            Log::error("WhatsApp sending failed for link {$link->id}: {$e->getMessage()}", ['link_id' => $link->id]);
            $link->update(['whatsapp_status' => NotificationStatus::Failed]);
        }
    }

    protected function getLandingUrl(Link $link): string
    {
        return url("/don/{$link->campaign->slug}/{$link->token}");
    }

    public function sendThank(string $status, Link $link): void
    {
        $url = $link->hosted_url;

        if ($link->updated_at->diffInHours(now()) >= 12 || empty($url)) {
            $url = url("/don/{$link->campaign->slug}/{$link->token}");
        }
        //$this->regenerateTransaction($link);
        
        //$url = $link->hosted_url ?? url("/don/{$link->campaign->slug}/{$link->token}");
        $optOutUrl = route('links.optout', [
            'campaign' => $link->campaign->id,
            'token'    => $link->token,
        ]);
        $message_no_relance = "❌ *Si vous ne souhaitez pas participer à cette campagne, cliquez ici :*\n $optOutUrl";
        
        //dd($url);
        $subjectMap = [
            'approved' => 'Merci pour votre don !',
            'canceled' => 'Paiement annulé',
            'pending'   => 'Paiement en attente',
            'relance'   => 'Relance donation',
        ];
        $stat = [
            'approved' => LinkStatus::Paid->value,
            'canceled' => LinkStatus::Failed->value,
            'pending'   => LinkStatus::Pending->value,
            'relance'   => 'relance',
        ];
        $image = [
            'approved' => $link->campaign->thank_image,
            'canceled' => $link->campaign->reminder_image,
            'pending'   => $link->campaign->reminder_image,
            'relance'   => $link->campaign->cover_image,
        ];
        $titre  = $link->donateur->sexe === 'F' ? 'Chère' : 'Cher';

        $initiator = '';
            if ($link->campaign->initiator_name) {
                $initiator = "*{$link->campaign->initiator_name}*"
                        . ($link->campaign->initiator_position ? "\n{$link->campaign->initiator_position}" : '');
            }
        
        $amount = $link->payments->first() ? $link->payments->first()->amount : 0;
        $bodyMap = [
            'approved' => "*🎉 Merci pour votre don !*\n\n" .
                          "$titre {$link->donateur->prenom} {$link->donateur->nom}, {$link->donateur->fonction}\n\n" .
                          "Votre contribution de *XOF {$amount}* a bien été reçue et validée. " .
                          "Votre soutien est précieux pour notre colloque.\n\n" .
                          "{$initiator}",
        
            'canceled' => "*⚠️ Paiement annulé*\n\n" .
                          "$titre {$link->donateur->prenom} {$link->donateur->nom}, {$link->donateur->fonction}\n\n" .
                          "Votre transaction a été annulée. Si vous souhaitez réessayer, cliquez ici :\n\n" .
                          "{$url}\n\n" .
                          "{$initiator}",
        
            'pending'  => "*⏳ Paiement en attente*\n\n" .
                          "$titre {$link->donateur->prenom} {$link->donateur->nom}, {$link->donateur->fonction}\n\n" .
                          "Votre paiement est en cours de traitement. Pour finaliser votre don, cliquez ici :\n\n" .
                          "{$url}\n\n" .
                          "{$initiator}",
            'relance' => "*⏳ Nous attendons toujours votre don.*\n\n" .
                        "$titre {$link->donateur->prenom} {$link->donateur->nom}, {$link->donateur->fonction}\n\n" .
                        ($link->campaign->reminder_message ? $link->campaign->reminder_message . ' ' : "Nous vous rappelons l'importance de votre soutien. ") .
                        "Pour finaliser votre don, cliquez ici :\n\n" .
                        "{$url}\n\n" .
                        "{$message_no_relance}\n\n" .
                        "{$initiator}",
        ];

        $subject = $subjectMap[$status] ?? 'Informations paiement';
        $body = $bodyMap[$status] ?? "$titre {$link->donateur->prenom} {$link->donateur->nom}, {$link->donateur->fonction}, statut : {$status}";
        // Email
        
        try {
            Mail::to($link->donateur->email)
                ->send(new ThankMail($status, $link, $url));
        } catch (\Exception $e) {
            //dd($e);
            Log::error("SendThankMail email failed link {$link->id}: {$e->getMessage()}");
        }

        // WhatsApp
        try {
            $to = $link->donateur->telephone;
            if (empty($to)) {
                Log::warning("WhatsApp not sent: no phone number for link {$link->id}");
                $link->update(['whatsapp_status' => NotificationStatus::Failed]);
                return;
            }
            $payload = [
                'token' => config('app.token'),
                'to'    => $to,
            ];
            if ($image[$status]) {
                //$imageUrl = "https://file-example.s3-accelerate.amazonaws.com/images/test.jpg";
                $imageUrl = asset('storage/' . $image[$status]);
                $payload['image'] = $imageUrl;
                $payload['caption'] = $body;
                $this->http->post('messages/image', [
                    'form_params' => $payload,
                ]);
            }
            else{
                $payload['body'] = $body;
                $this->http->post('messages/chat', [
                    'form_params' => $payload,
                ]);
            }

            $link->update(['whatsapp_status' => NotificationStatus::Sent]);
        } catch (\Exception $e) {
            Log::error("SendThankMail WhatsApp failed link {$link->id}: {$e->getMessage()}");
            $link->update(['whatsapp_status' => NotificationStatus::Failed]);
        }
    }

    public function sendReminder(Link $link): void
    {
        // On délègue tout à sendThank, qui gère email + WhatsApp selon le statut
        $this->sendThank('relance', $link);
    }

}
