<?php
/**
 * Sistema de Notificações WhatsApp - MontaLoja
 * Gerencia templates e envio de notificações automáticas
 */

require_once __DIR__ . '/EvolutionAPI.php';

class WhatsAppNotification {
    private $api;
    private $pdo;
    private $storeId;
    private $storeName;
    
    public function __construct(PDO $pdo, int $storeId) {
        $this->pdo = $pdo;
        $this->storeId = $storeId;
        
        $stmt = $pdo->prepare('SELECT * FROM stores WHERE id = ?');
        $stmt->execute([$storeId]);
        $store = $stmt->fetch(PDO::FETCH_ASSOC);
        
        $this->storeName = $store['name'] ?? 'MontaLoja';
        
        $config = $this->getConfig();
        
        if ($config && !empty($config['api_url']) && !empty($config['api_key'])) {
            $this->api = new EvolutionAPI(
                $config['api_url'],
                $config['api_key'],
                $config['instance_name'] ?? 'store_' . $storeId
            );
        }
    }
    
    public function isConfigured(): bool {
        return $this->api !== null;
    }
    
    public function isConnected(): bool {
        if (!$this->api) return false;
        
        $state = $this->api->getConnectionState();
        return $state['success'] && 
               isset($state['data']['state']) && 
               $state['data']['state'] === 'open';
    }
    
    public function getConfig(): ?array {
        try {
            $stmt = $this->pdo->prepare('SELECT * FROM whatsapp_config WHERE store_id = ?');
            $stmt->execute([$this->storeId]);
            return $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
        } catch (Exception $e) {
            return null;
        }
    }
    
    public function saveConfig(array $config): bool {
        try {
            $existing = $this->getConfig();
            
            if ($existing) {
                $stmt = $this->pdo->prepare('UPDATE whatsapp_config SET 
                    api_url = ?, api_key = ?, instance_name = ?, 
                    notify_new_order = ?, notify_status_change = ?, 
                    notify_payment = ?, notify_shipping = ?,
                    updated_at = NOW() WHERE store_id = ?');
                return $stmt->execute([
                    $config['api_url'],
                    $config['api_key'],
                    $config['instance_name'],
                    $config['notify_new_order'] ?? 1,
                    $config['notify_status_change'] ?? 1,
                    $config['notify_payment'] ?? 1,
                    $config['notify_shipping'] ?? 1,
                    $this->storeId
                ]);
            } else {
                $stmt = $this->pdo->prepare('INSERT INTO whatsapp_config 
                    (store_id, api_url, api_key, instance_name, notify_new_order, 
                    notify_status_change, notify_payment, notify_shipping, created_at) 
                    VALUES (?, ?, ?, ?, ?, ?, ?, ?, NOW())');
                return $stmt->execute([
                    $this->storeId,
                    $config['api_url'],
                    $config['api_key'],
                    $config['instance_name'],
                    $config['notify_new_order'] ?? 1,
                    $config['notify_status_change'] ?? 1,
                    $config['notify_payment'] ?? 1,
                    $config['notify_shipping'] ?? 1
                ]);
            }
        } catch (Exception $e) {
            error_log('Erro ao salvar config WhatsApp: ' . $e->getMessage());
            return false;
        }
    }
    
    public function getAPI(): ?EvolutionAPI {
        return $this->api;
    }
    
    public function notifyNewOrder(array $order): array {
        if (!$this->isConfigured()) {
            return ['success' => false, 'error' => 'WhatsApp não configurado'];
        }
        
        $phone = $order['customer_phone'] ?? '';
        if (empty($phone)) {
            return ['success' => false, 'error' => 'Cliente sem telefone'];
        }
        
        $message = $this->buildOrderMessage($order);
        $result = $this->api->sendText($phone, $message);
        
        $this->logNotification($order['id'] ?? 0, 'new_order', $phone, $result['success']);
        
        return $result;
    }
    
    public function notifyStatusChange(array $order, string $oldStatus, string $newStatus): array {
        if (!$this->isConfigured()) {
            return ['success' => false, 'error' => 'WhatsApp não configurado'];
        }
        
        $phone = $order['customer_phone'] ?? '';
        if (empty($phone)) {
            return ['success' => false, 'error' => 'Cliente sem telefone'];
        }
        
        $message = $this->buildStatusMessage($order, $newStatus);
        $result = $this->api->sendText($phone, $message);
        
        $this->logNotification($order['id'] ?? 0, 'status_' . $newStatus, $phone, $result['success']);
        
        return $result;
    }
    
    public function notifyPaymentConfirmed(array $order): array {
        if (!$this->isConfigured()) {
            return ['success' => false, 'error' => 'WhatsApp não configurado'];
        }
        
        $phone = $order['customer_phone'] ?? '';
        if (empty($phone)) {
            return ['success' => false, 'error' => 'Cliente sem telefone'];
        }
        
        $message = $this->buildPaymentMessage($order);
        $result = $this->api->sendText($phone, $message);
        
        $this->logNotification($order['id'] ?? 0, 'payment_confirmed', $phone, $result['success']);
        
        return $result;
    }
    
    public function notifyShipping(array $order, string $trackingCode = ''): array {
        if (!$this->isConfigured()) {
            return ['success' => false, 'error' => 'WhatsApp não configurado'];
        }
        
        $phone = $order['customer_phone'] ?? '';
        if (empty($phone)) {
            return ['success' => false, 'error' => 'Cliente sem telefone'];
        }
        
        $message = $this->buildShippingMessage($order, $trackingCode);
        $result = $this->api->sendText($phone, $message);
        
        $this->logNotification($order['id'] ?? 0, 'shipping', $phone, $result['success']);
        
        return $result;
    }
    
    public function sendCustomMessage(string $phone, string $message): array {
        if (!$this->isConfigured()) {
            return ['success' => false, 'error' => 'WhatsApp não configurado'];
        }
        
        return $this->api->sendText($phone, $message);
    }
    
    private function buildOrderMessage(array $order): string {
        $customerName = $order['customer_name'] ?? 'Cliente';
        $orderId = $order['id'] ?? '0';
        $total = number_format($order['total_amount'] ?? 0, 2, ',', '.');
        
        return "🛒 *Pedido Recebido!*

Olá, {$customerName}! 👋

Seu pedido *#{$orderId}* foi recebido com sucesso!

💰 *Valor Total:* R$ {$total}

Acompanhe o status do seu pedido. Em breve você receberá mais atualizações!

Obrigado por comprar na *{$this->storeName}*! 💛";
    }
    
    private function buildStatusMessage(array $order, string $status): string {
        $customerName = $order['customer_name'] ?? 'Cliente';
        $orderId = $order['id'] ?? '0';
        
        $statusMessages = [
            'paid' => "✅ *Pagamento Confirmado!*\n\nOlá, {$customerName}!\n\nO pagamento do seu pedido *#{$orderId}* foi confirmado!\n\nEstamos preparando seu pedido. 📦",
            'preparing' => "📦 *Pedido em Preparação!*\n\nOlá, {$customerName}!\n\nSeu pedido *#{$orderId}* está sendo preparado com muito carinho!\n\nEm breve será enviado. 🚚",
            'shipped' => "🚚 *Pedido Enviado!*\n\nOlá, {$customerName}!\n\nSeu pedido *#{$orderId}* foi enviado!\n\nAguarde a chegada! 📬",
            'delivered' => "🎉 *Pedido Entregue!*\n\nOlá, {$customerName}!\n\nSeu pedido *#{$orderId}* foi entregue!\n\nEsperamos que você goste! 💛",
            'cancelled' => "❌ *Pedido Cancelado*\n\nOlá, {$customerName}.\n\nInformamos que seu pedido *#{$orderId}* foi cancelado.\n\nEm caso de dúvidas, entre em contato conosco."
        ];
        
        $message = $statusMessages[$status] ?? "📋 *Atualização do Pedido*\n\nOlá, {$customerName}!\n\nO status do seu pedido *#{$orderId}* foi atualizado.";
        
        return $message . "\n\n*{$this->storeName}*";
    }
    
    private function buildPaymentMessage(array $order): string {
        $customerName = $order['customer_name'] ?? 'Cliente';
        $orderId = $order['id'] ?? '0';
        $total = number_format($order['total_amount'] ?? 0, 2, ',', '.');
        
        return "💳 *Pagamento Confirmado!*

Olá, {$customerName}! 👋

Confirmamos o recebimento do pagamento do seu pedido *#{$orderId}*!

💰 *Valor:* R$ {$total}

Seu pedido já está na fila de preparação! 📦

*{$this->storeName}* 💛";
    }
    
    private function buildShippingMessage(array $order, string $trackingCode): string {
        $customerName = $order['customer_name'] ?? 'Cliente';
        $orderId = $order['id'] ?? '0';
        
        $message = "🚚 *Pedido Enviado!*

Olá, {$customerName}! 👋

Seu pedido *#{$orderId}* foi enviado!";

        if (!empty($trackingCode)) {
            $message .= "

📦 *Código de Rastreio:* {$trackingCode}
🔗 Rastreie em: https://www.linkcorreios.com.br/?id={$trackingCode}";
        }
        
        $message .= "

Aguarde a chegada! 📬

*{$this->storeName}* 💛";

        return $message;
    }
    
    private function logNotification(int $orderId, string $type, string $phone, bool $success): void {
        try {
            $stmt = $this->pdo->prepare('INSERT INTO whatsapp_notifications_log 
                (store_id, order_id, notification_type, phone, success, created_at) 
                VALUES (?, ?, ?, ?, ?, NOW())');
            $stmt->execute([$this->storeId, $orderId, $type, $phone, $success ? 1 : 0]);
        } catch (Exception $e) {
            error_log('Erro ao registrar log WhatsApp: ' . $e->getMessage());
        }
    }
}
