<?php
namespace App\Services;

use App\Models\Assignment;
use App\Models\Schedule;
use App\Config\Env;

/**
 * Servicio para manejar el Bot de Telegram
 */
class TelegramBot
{
    private $token;
    private $apiUrl;
    private $assignmentModel;
    private $scheduleModel;
    private $pdfService;
    
    public function __construct()
    {
        $this->token = Env::get('TELEGRAM_BOT_TOKEN');
        $this->apiUrl = "https://api.telegram.org/bot{$this->token}/";
        $this->assignmentModel = new Assignment();
        $this->scheduleModel = new Schedule();
        $this->pdfService = new PDFService();
    }
    
    /**
     * Procesa la solicitud entrante del Webhook
     */
    public function processWebhook($data)
    {
        if (!isset($data['message'])) {
            return;
        }
        
        $message = $data['message'];
        $chatId = $message['chat']['id'];
        $text = trim($message['text'] ?? '');
        
        // Log básico para debug
        error_log("Telegram Msg: $text from $chatId");
        
        // Comandos de sistema
        if ($text === '/start' || $text === '/menu') {
            $this->sendMainMenu($chatId);
            return;
        }
        
        // Manejo de botones del menú
        switch ($text) {
            case '📅 Itinerario':
                $this->sendRotationTable($chatId);
                break;
                
            case '⏰ Horas':
                $this->sendContainerHours($chatId);
                break;
                
            case '📄 PDF':
                $this->sendPdf($chatId);
                break;
                
            default:
                // Si es un comando antiguo, soportarlo
                if (strpos($text, '/') === 0) {
                    $parts = explode(' ', $text);
                    $command = strtolower($parts[0]);
                    
                    if ($command === '/tabla') $this->sendRotationTable($chatId);
                    elseif ($command === '/pdf') $this->sendPdf($chatId);
                    elseif ($command === '/horario') {
                        $args = array_slice($parts, 1);
                        $this->sendUserSchedule($chatId, implode(' ', $args));
                    }
                } else {
                    // Si es texto libre, asumir que es búsqueda de nombre
                    if (!empty($text)) {
                        $this->sendUserSchedule($chatId, $text);
                    }
                }
                break;
        }
    }
    
    /**
     * Envía el menú principal con botones
     */
    private function sendMainMenu($chatId)
    {
        $keyboard = [
            'keyboard' => [
                [['text' => '📅 Itinerario'], ['text' => '⏰ Horas']],
                [['text' => '📄 PDF']]
            ],
            'resize_keyboard' => true,
            'persistent' => true
        ];
        
        $msg = "👋 ¡Hola! Soy el Bot del Contenedor de Ibiza.\n\n" . 
               "Selecciona una opción del menú o *escribe el nombre* de una persona para ver sus turnos.";
               
        $this->sendMessage($chatId, $msg, $keyboard);
    }
    
    /**
     * Envía los horarios de apertura
     */
    private function sendContainerHours($chatId)
    {
        $schedules = $this->scheduleModel->getAll();
        $daysMap = [0 => 'Domingo', 1 => 'Lunes', 2 => 'Martes', 3 => 'Miércoles', 4 => 'Jueves', 5 => 'Viernes', 6 => 'Sábado'];
        
        $msg = "⏰ *Horarios de Apertura*\n\n";
        
        foreach ($schedules as $sch) {
            $dayName = $daysMap[$sch['day_of_week']] ?? 'Día ' . $sch['day_of_week'];
            $t1 = $sch['opening_time_1'] ? substr($sch['opening_time_1'], 0, 5) : null;
            $t2 = $sch['opening_time_2'] ? substr($sch['opening_time_2'], 0, 5) : null;
            
            $status = "Cerrado";
            if ($t1 || $t2) {
                $status = "";
                if ($t1) $status .= "$t1 ";
                if ($t2) $status .= "| $t2";
            } else {
                $status = "🚫 Cerrado";
            }
            
            $msg .= "*$dayName*: $status\n";
        }
        
        $this->sendMessage($chatId, $msg);
    }
    
    /**
     * Envía mensaje de texto (con teclado opcional)
     */
    public function sendMessage($chatId, $text, $keyboard = null)
    {
        $data = [
            'chat_id' => $chatId,
            'text' => $text,
            'parse_mode' => 'Markdown'
        ];
        
        if ($keyboard) {
            $data['reply_markup'] = json_encode($keyboard);
        }
        
        $this->request('sendMessage', $data);
    }

    // ... (El resto de métodos handleCommand antiguos se pueden eliminar o dejar como legacy si se invocan internamente, pero aquí reestructuramos processWebhook)
    
    /**
     * Envía la tabla de rotación en texto
     */
    private function sendRotationTable($chatId)
    {
        $assignments = $this->assignmentModel->getUpcoming(10); // Ver más semanas
        
        if (empty($assignments)) {
            $this->sendMessage($chatId, "No hay rotaciones programadas próximamente.");
            return;
        }
        
        $msg = "📅 *Itinerario de Rotación*\n\n";
        
        foreach ($assignments as $asg) {
            $dates = date('d/m', strtotime($asg['start_date'])) . "-" . date('d/m', strtotime($asg['end_date']));
            $msg .= "`" . str_pad($dates, 11) . "` : *" . $asg['full_name'] . "*\n";
        }
        
        $this->sendMessage($chatId, $msg);
    }
    
    /**
     * Busca y envía el horario de un usuario
     */
    private function sendUserSchedule($chatId, $name)
    {
        // Buscar por nombre similar
        $assignments = $this->assignmentModel->searchByName($name);
        
        if (empty($assignments)) {
            $this->sendMessage($chatId, "🤷‍♂️ No encontré turnos futuros para \"$name\".\nIntenta escribir solo el nombre, ej: *Ana*");
            return;
        }
        
        // Agrupar por usuario si la búsqueda trae varios (Ana Maria, Ana Lu)
        // Pero searchByName ordena por fecha.
        // Asumimos que queremos ver próximos turnos de todos los matches
        
        // Optimización: Si hay muchos resultados distintos usuarios, avisar.
        // Por ahora listamos todo simple.
        
        $msg = "👤 *Resultados para \"$name\"*\n\n";
        $count = 0;
        
        foreach ($assignments as $asg) {
            if ($count >= 10) break; // Limitar
            $msg .= "🔹 *" . $asg['full_name'] . "*: Semana " . $asg['week_number'] . "\n";
            $msg .= "   (" . date('d/m', strtotime($asg['start_date'])) . " - " . date('d/m', strtotime($asg['end_date'])) . ")\n\n";
            $count++;
        }
        
        $this->sendMessage($chatId, $msg);
    }
    
    /**
     * Genera y envía el PDF
     */
    private function sendPdf($chatId)
    {
        $this->sendMessage($chatId, "📄 Generando PDF...");
        
        try {
            $tmpDir = sys_get_temp_dir();
            $filename = "Rotacion_" . date('Y-m-d') . ".pdf";
            $path = $tmpDir . '/' . $filename;
            
            $this->pdfService->generate('F', $path);
            $this->sendDocument($chatId, $path);
            @unlink($path);
            
        } catch (\Exception $e) {
            error_log("Error PDF Telegram: " . $e->getMessage());
            $this->sendMessage($chatId, "❌ Hubo un error al generar el PDF.");
        }
    }
    
    /**
     * Envía un documento
     */
    private function sendDocument($chatId, $filePath)
    {
        $cFile = new \CURLFile($filePath);
        $data = [
            'chat_id' => $chatId,
            'document' => $cFile
        ];
        
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->apiUrl . "sendDocument");
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        curl_close($ch);
        
        return $result;
    }
    
    /**
     * Realiza petición cURL
     */
    private function request($method, $data)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $this->apiUrl . $method);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

    public function setWebhook($url)
    {
        return $this->request('setWebhook', ['url' => $url]);
    }
    /**
     * Obtiene información del Webhook
     */
    public function getWebhookInfo()
    {
        $response = $this->request('getWebhookInfo', []);
        return json_decode($response, true);
    }

    /**
     * Elimina el Webhook actual
     */
    public function deleteWebhook()
    {
        return $this->request('deleteWebhook', []);
    }
}
