<?php
/**
 * Support Ticket System
 * سیستم تیکت پشتیبانی
 * 
 * Uses unified support_tickets + support_messages tables
 */

namespace GemAcc;

use PDO;

class Support
{
    private PDO $pdo;
    
    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }
    
    /**
     * ایجاد تیکت جدید یا برگرداندن تیکت باز
     */
    public function getOrCreateTicket(int $userId): array
    {
        // بررسی آیا تیکت باز دارد
        $stmt = $this->pdo->prepare("
            SELECT * FROM support_tickets 
            WHERE user_id = ? AND status IN ('OPEN', 'ANSWERED')
            ORDER BY created_at DESC LIMIT 1
        ");
        $stmt->execute([$userId]);
        $ticket = $stmt->fetch(PDO::FETCH_ASSOC);
        
        if ($ticket) {
            return $ticket;
        }
        
        // ایجاد تیکت جدید
        $stmt = $this->pdo->prepare("INSERT INTO support_tickets (user_id, status) VALUES (?, 'OPEN')");
        $stmt->execute([$userId]);
        
        return [
            'id'         => (int)$this->pdo->lastInsertId(),
            'user_id'    => $userId,
            'status'     => 'OPEN',
            'created_at' => date('Y-m-d H:i:s'),
        ];
    }
    
    /**
     * افزودن پیام به تیکت
     * Uses unified support_messages table with sender_role (USER/ADMIN)
     */
    public function addMessage(int $ticketId, int $senderId, string $message, bool $isAdmin = false, ?string $fileId = null): int
    {
        $senderRole = $isAdmin ? 'ADMIN' : 'USER';
        
        $stmt = $this->pdo->prepare("
            INSERT INTO support_messages (ticket_id, sender_id, sender_role, message_text, telegram_file_id)
            VALUES (?, ?, ?, ?, ?)
        ");
        $stmt->execute([$ticketId, $senderId, $senderRole, $message, $fileId]);
        
        // بروزرسانی وضعیت تیکت
        $newStatus = $isAdmin ? 'ANSWERED' : 'OPEN';
        $this->updateTicketStatus($ticketId, $newStatus);
        
        return (int)$this->pdo->lastInsertId();
    }
    
    /**
     * بروزرسانی وضعیت تیکت
     */
    public function updateTicketStatus(int $ticketId, string $status): bool
    {
        $stmt = $this->pdo->prepare("UPDATE support_tickets SET status = ?, updated_at = NOW() WHERE id = ?");
        return $stmt->execute([$status, $ticketId]);
    }
    
    /**
     * بستن تیکت
     */
    public function closeTicket(int $ticketId): bool
    {
        return $this->updateTicketStatus($ticketId, 'CLOSED');
    }
    
    /**
     * گرفتن پیام‌های یک تیکت
     */
    public function getMessages(int $ticketId, int $limit = 50): array
    {
        $stmt = $this->pdo->prepare("
            SELECT sm.*, u.first_name, u.username
            FROM support_messages sm
            LEFT JOIN users u ON sm.sender_id = u.id
            WHERE sm.ticket_id = ?
            ORDER BY sm.created_at ASC
            LIMIT ?
        ");
        $stmt->bindValue(1, $ticketId, PDO::PARAM_INT);
        $stmt->bindValue(2, $limit, PDO::PARAM_INT);
        $stmt->execute();
        
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    
    /**
     * گرفتن تیکت با آیدی
     */
    public function getTicketById(int $ticketId): ?array
    {
        $stmt = $this->pdo->prepare("
            SELECT t.*, u.first_name, u.username
            FROM support_tickets t
            LEFT JOIN users u ON t.user_id = u.id
            WHERE t.id = ?
        ");
        $stmt->execute([$ticketId]);
        return $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
    }
    
    /**
     * گرفتن تیکت‌های کاربر
     */
    public function getUserTickets(int $userId, int $limit = 10): array
    {
        $stmt = $this->pdo->prepare("
            SELECT * FROM support_tickets 
            WHERE user_id = ?
            ORDER BY created_at DESC
            LIMIT ?
        ");
        $stmt->bindValue(1, $userId, PDO::PARAM_INT);
        $stmt->bindValue(2, $limit, PDO::PARAM_INT);
        $stmt->execute();
        
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    
    /**
     * گرفتن تیکت‌های باز (برای ادمین)
     */
    public function getOpenTickets(int $limit = 50): array
    {
        $stmt = $this->pdo->prepare("
            SELECT t.*, u.first_name, u.username,
                   (SELECT COUNT(*) FROM support_messages WHERE ticket_id = t.id) as message_count
            FROM support_tickets t
            LEFT JOIN users u ON t.user_id = u.id
            WHERE t.status = 'OPEN'
            ORDER BY t.updated_at DESC
            LIMIT ?
        ");
        $stmt->bindValue(1, $limit, PDO::PARAM_INT);
        $stmt->execute();
        
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    
    /**
     * گرفتن آخرین پیام تیکت
     */
    public function getLastMessage(int $ticketId): ?array
    {
        $stmt = $this->pdo->prepare("
            SELECT * FROM support_messages 
            WHERE ticket_id = ?
            ORDER BY created_at DESC
            LIMIT 1
        ");
        $stmt->execute([$ticketId]);
        return $stmt->fetch(PDO::FETCH_ASSOC) ?: null;
    }
    
    /**
     * علامت‌گذاری پیام‌ها به عنوان خوانده شده
     */
    public function markMessagesAsRead(int $ticketId, string $readerRole): bool
    {
        // اگر ادمین می‌خواند، پیام‌های USER را علامت می‌زند و بالعکس
        $targetRole = $readerRole === 'ADMIN' ? 'USER' : 'ADMIN';
        
        $stmt = $this->pdo->prepare("
            UPDATE support_messages 
            SET is_read = 1 
            WHERE ticket_id = ? AND sender_role = ?
        ");
        return $stmt->execute([$ticketId, $targetRole]);
    }
    
    /**
     * تعداد پیام‌های خوانده نشده برای ادمین
     */
    public function getUnreadCountForAdmin(): int
    {
        $stmt = $this->pdo->query("
            SELECT COUNT(*) FROM support_messages 
            WHERE sender_role = 'USER' AND is_read = 0
        ");
        return (int)$stmt->fetchColumn();
    }
    
    /**
     * آمار تیکت‌ها
     */
    public function getStats(): array
    {
        $stmt = $this->pdo->query("
            SELECT 
                COUNT(*) as total,
                SUM(CASE WHEN status = 'OPEN' THEN 1 ELSE 0 END) as open_count,
                SUM(CASE WHEN status = 'ANSWERED' THEN 1 ELSE 0 END) as answered_count,
                SUM(CASE WHEN status = 'CLOSED' THEN 1 ELSE 0 END) as closed_count
            FROM support_tickets
        ");
        
        return $stmt->fetch(PDO::FETCH_ASSOC) ?: [];
    }
    
    /**
     * لیبل وضعیت تیکت
     */
    public static function getStatusLabel(string $status): string
    {
        $labels = [
            'OPEN'     => '🟠 باز',
            'WAITING'  => '🟡 در انتظار',
            'ANSWERED' => '🟢 پاسخ داده شده',
            'CLOSED'   => '⚪ بسته شده',
        ];
        return $labels[$status] ?? $status;
    }
}
