<?php
namespace EasyChat\Library\Ai;

use EasyChat\Library\CustomerContactService;




class StepContactExtract implements StepInterface {

    







    private function sanitizeEmail($raw) {
        $email = trim($raw);
        if ($email === '') {
            return '';
        }

         
        if (strpos($email, '@') !== false) {
            return filter_var($email, FILTER_VALIDATE_EMAIL) ? $email : '';
        }

         
        $pos = strrpos($email, ' ');
        if ($pos !== false) {
            $candidate = substr_replace($email, '@', $pos, 1);
            if (filter_var($candidate, FILTER_VALIDATE_EMAIL)) {
                return $candidate;
            }
        }

         
        return '';
    }

    private function hasContactCandidate($text) {
        $text = trim((string)$text);
        if ($text === '') {
            return false;
        }

         
         
         
         
        if (strpos($text, '@') !== false) {
            return true;
        }

        if (preg_match('/(?:\\+?\\d[\\s\\-()_.]*){6,}/u', $text)) {
            return true;
        }

        if (preg_match('/\\b[\\p{L}0-9._%+\\-]+\\s+(?:mail|gmail|yandex|ya|bk|list|inbox|rambler)\\s*(?:ru|com)?\\b/iu', $text)) {
            return true;
        }

        return false;
    }

    public function execute(array &$context, array $settings) {
        $chat_id = (int)$context['chat_id'];

        $context['ai_responder']->log("[Шаг: Извлечение контактов] Анализ сообщения: \"" . $context['last_message'] . "\"");

        if (!$this->hasContactCandidate($context['last_message'])) {
            $context['ai_responder']->log("[Шаг: Извлечение контактов] Пропуск: в сообщении нет признаков email или телефона.");
            return null;
        }

         
        $company_contacts = [];
        if (!empty($settings['chat_widget_phone'])) {
            $company_contacts[] = $settings['chat_widget_phone'];
        }
        if (!empty($settings['chat_widget_email'])) {
            $company_contacts[] = $settings['chat_widget_email'];
        }
        if (!empty($settings['chat_widget_whatsapp'])) {
            $company_contacts[] = $settings['chat_widget_whatsapp'];
        }

        $prompt  = "Ты — вспомогательный аналитический инструмент. Твоя задача — проанализировать последнее сообщение клиента в чате интернет-магазина и извлечь его контактные данные (Email и/или номер телефона).\n\n";
        $prompt .= "ВАЖНЫЕ ПРАВИЛА:\n";
        $prompt .= "1. Если клиент отправляет номер телефона или email — по умолчанию считай что это ЕГО ЛИЧНЫЙ контакт и извлекай.\n";
        $prompt .= "2. НЕ извлекай, если клиент ЯВНО говорит что это контакт другого человека или компании (друга, коллеги, другого сайта).\n";
        $prompt .= "3. НЕ извлекай, если клиент ЗАДАЕТ ВОПРОС про номер, который уже фигурирует в переписке (например: «сюда позвонить?», «это ваш телефон?», «по этому номеру можно связаться?»).\n";

        if (!empty($company_contacts)) {
            $prompt .= "4. Следующие контакты принадлежат НАШЕЙ КОМПАНИИ. Никогда не извлекай их как контакты клиента: " . implode(', ', $company_contacts) . "\n";
        }

        $prompt .= "\nПримеры:\n";
        $prompt .= "— «Мой номер +79991234567, перезвоните» → извлекаем.\n";
        $prompt .= "— «Напишите мне на ivan@mail.ru» → извлекаем.\n";
        $prompt .= "— «89161112233» (просто номер) → извлекаем, это контакт клиента.\n";
        $prompt .= "— «ivan@mail.ru» (просто email) → извлекаем, это контакт клиента.\n";
		$prompt .= "— «ivan mail ru» (невалидный email) → извлекаем, это контакт клиента, но верни валидный, в данном случае это ivan@mail.ru.\n";
        $prompt .= "— «88002222555 сюда позвонить?» → НЕ извлекаем, клиент спрашивает про чужой/наш номер.\n";
        $prompt .= "— «Позвоните моему другу по номеру +79001112233» → НЕ извлекаем, чужой контакт.\n";
        $prompt .= "— «У компании Apple почта support@apple.com» → НЕ извлекаем, чужой контакт.\n\n";
        $prompt .= "Ответь СТРОГО в формате JSON с ключами \"email\" и \"phone\".\n";
        $prompt .= "Если контакт не найден или принадлежит не клиенту, оставь значение пустой строкой.\n";
        $prompt .= "Не добавляй пояснений, markdown-форматирования или другого текста. Только валидный JSON.\n\n";
        $prompt .= "Сообщение клиента: \"{$context['last_message']}\"\n\n";
        $prompt .= "Ваш ответ:";

        $response = $context['ai_responder']->callAPI(
            [['role' => 'user', 'content' => $prompt]],
            0.1,
            [
                'max_tokens' => 160,
                'timeout' => 12,
            ]
        );

        if ($response) {
            $cleaned = trim($response);
             
            if (strpos($cleaned, '```') === 0) {
                $cleaned = preg_replace('/^```(?:json)?\s*/i', '', $cleaned);
                $cleaned = preg_replace('/\s*```$/', '', $cleaned);
                $cleaned = trim($cleaned);
            }
            
            $data = json_decode($cleaned, true);
            if (is_array($data)) {
                $raw_email = isset($data['email']) ? trim($data['email']) : '';
                $phone = isset($data['phone']) ? trim($data['phone']) : '';

                 
                $email = $this->sanitizeEmail($raw_email);
                if ($raw_email !== '' && $email === '') {
                    $context['ai_responder']->log("[Шаг: Извлечение контактов] Email \"{$raw_email}\" не прошёл валидацию и был отброшен.");
                } elseif ($raw_email !== '' && $raw_email !== $email) {
                    $context['ai_responder']->log("[Шаг: Извлечение контактов] Email автоматически исправлен: \"{$raw_email}\" → \"{$email}\"");
                }

                if ($email || $phone) {
                    $message_id = (int)($context['target_message_id'] ?? 0);
                    (new CustomerContactService($context['registry']))->recordDetectedContactsForChat($chat_id, $email, $phone, 'ai', $message_id);
                    $context['ai_responder']->log("[Шаг: Извлечение контактов] Контакты добавлены в карточку клиента для чата #{$chat_id}. Email: '{$email}', Телефон: '{$phone}'");
                } else {
                    $context['ai_responder']->log("[Шаг: Извлечение контактов] Контакты в сообщении не обнаружены.");
                }
            } else {
                $context['ai_responder']->log("[Шаг: Извлечение контактов] Ошибка: Не удалось распарсить ответ ИИ как JSON: \"" . $response . "\"");
            }
        } else {
            $context['ai_responder']->log("[Шаг: Извлечение контактов] Ошибка: Не удалось получить ответ от ИИ.");
        }

         
        return null;
    }
}
