# import telebot
# from decouple import config
# from django.shortcuts import get_object_or_404
# from web.models import Client, ServiceRequest, Order
# from comunication.models import TelegramSettings
# import re
# import base64
# import logging

# class TelegramBot:
#     def __init__(self):
#         # Get bot settings from the database
#         bot_settings = TelegramSettings.objects.first()
#         if bot_settings:
#             TELEGRAM_BOT_TOKEN = bot_settings.bot_token
#             self.bot = telebot.TeleBot(TELEGRAM_BOT_TOKEN)
#         else:
#             raise Exception("Telegram bot settings not found")

#     def start_bot_polling(self):
#         @self.bot.message_handler(commands=['start'])
#         def send_welcome(message):
#             # Проверяем, содержатся ли параметры в команде /start
#             match = re.match(r'/start request_(\d+)_token_(.*)', message.text)
#             if match:
#                 self.handle_confirm_command(message, match)
#             elif message.text.strip() == '/start':
#                 self.bot.reply_to(message, "Ошибка: Некорректная команда. Пожалуйста, используйте ссылку, предоставленную на сайте для регистрации.")
#             else:
#                 self.bot.reply_to(message, "Здравствуйте! Чем я могу помочь? Вы можете задать вопросы о статусе заявки или заказе.")

#         @self.bot.message_handler(func=lambda message: 'статус заявки' in message.text.lower())
#         def handle_service_request_status(message):
#             chat_id = message.chat.id
#             client = Client.objects.filter(chat_id=chat_id).first()
#             if client:
#                 service_requests = ServiceRequest.objects.filter(client_email=client.email)
#                 if service_requests.exists():
#                     response = "Ваши заявки:\n"
#                     for req in service_requests:
#                         response += f"Номер заявки: {req.id}, Услуга: {req.service.name}, Дата создания: {req.created_at.strftime('%d-%m-%Y')}\n"
#                 else:
#                     response = "У вас нет активных заявок."
#             else:
#                 response = "Клиент не найден. Пожалуйста, зарегистрируйтесь."
#             self.bot.reply_to(message, response)

#         @self.bot.message_handler(func=lambda message: 'статус заказа' in message.text.lower())
#         def handle_order_status(message):
#             chat_id = message.chat.id
#             client = Client.objects.filter(chat_id=chat_id).first()
#             if client:
#                 orders = Order.objects.filter(client=client)
#                 if orders.exists():
#                     response = "Ваши заказы:\n"
#                     for order in orders:
#                         response += f"Номер заказа: {order.id}, Услуга: {order.service.name}, Статус: {order.get_status_display()}\n"
#                 else:
#                     response = "У вас нет активных заказов."
#             else:
#                 response = "Клиент не найден. Пожалуйста, зарегистрируйтесь."
#             self.bot.reply_to(message, response)

#         self.bot.polling(non_stop=True)

#     def handle_confirm_command(self, message, match=None):
#         chat_id = message.chat.id
#         if not match:
#             match = re.match(r'/start request_(\d+)_token_(.*)', message.text)
#         if match:
#             request_id = match.group(1)
#             encoded_token = match.group(2)

#             # Декодируем токен из base64
#             try:
#                 token = base64.urlsafe_b64decode(encoded_token + '==').decode('utf-8')
#                 logging.info(f"Декодированный токен: {token}")
#             except Exception as e:
#                 logging.error(f"Ошибка при декодировании токена: {e}")
#                 self.bot.send_message(chat_id, "Ошибка: Некорректный токен. Пожалуйста, повторите попытку позже.")
#                 return

#             # Получаем заявку по ID и токену
#             service_request = ServiceRequest.objects.filter(id=request_id, token=token).first()
#             if service_request:
#                 # Обновляем chat_id клиента
#                 service_request.chat_id = chat_id
#                 service_request.client_name = message.from_user.first_name
#                 service_request.save()

#                 response_message = (
#                     f"Здравствуйте, {message.from_user.first_name}!\n"
#                     f"Ваша заявка на услугу успешно зарегистрирована. "
#                     f"Пожалуйста, вернитесь на сайт для продолжения оформления."
#                 )
#             else:
#                 response_message = "Ошибка: Неверная заявка или токен. Пожалуйста, проверьте ссылку."

#             self.bot.send_message(chat_id, response_message)
#         else:
#             response_message = "Ошибка: Некорректная команда. Пожалуйста, используйте ссылку, предоставленную на сайте для регистрации."
#             self.bot.send_message(chat_id, response_message)

#     def send_telegram_message(self, client_id, service_request_id, custom_message, order_id=None):
#         # Get the client and service request from the database
#         client = get_object_or_404(Client, pk=client_id)
#         service_request = get_object_or_404(ServiceRequest, pk=service_request_id)
#         chat_id = client.chat_id

#         # Build the message content
#         message = f"Здравствуйте, {client.first_name} {client.last_name}!\n"
#         message += custom_message

#         if order_id:
#             order = get_object_or_404(Order, pk=order_id)
#             message += f"\n\nДетали заказа:\nУслуга: {order.service.name}\nСтатус: {order.get_status_display()}\n"
        
#         # Add service request details
#         message += f"\nНомер заявки: {service_request.id}\nДата создания заявки: {service_request.created_at.strftime('%d-%m-%Y')}\n"

#         # Send the message using the bot
#         try:
#             self.bot.send_message(chat_id, message)
#         except Exception as e:
#             logging.error(f"Ошибка при отправке сообщения в Telegram: {e}")


import telebot
from telebot import types
from decouple import config
from django.shortcuts import get_object_or_404
from web.models import Client, ServiceRequest, Order
from comunication.models import TelegramSettings
import re
import base64
import logging

class TelegramBot:
    def __init__(self):
        # Get bot settings from the database
        bot_settings = TelegramSettings.objects.first()
        if bot_settings:
            TELEGRAM_BOT_TOKEN = bot_settings.bot_token
            self.bot = telebot.TeleBot(TELEGRAM_BOT_TOKEN)
        else:
            raise Exception("Telegram bot settings not found")

    def start_bot_polling(self):
        @self.bot.message_handler(commands=['start'])
        def send_welcome(message):
            # Проверяем, содержатся ли параметры в команде /start
            match = re.match(r'/start request_(\d+)_token_(.*)', message.text)
            if match:
                self.handle_confirm_command(message, match)
            elif message.text.strip() == '/start':
                kbd = types.InlineKeyboardMarkup()
                url_btn = types.InlineKeyboardButton('Перейти на сайт', url=config("URL"))
                kbd.add(url_btn)
                self.bot.reply_to(message, "Здравствуйте! Данный бот предназначен для информирования клиентов SmartSolTech и регистрации на сайте. Пройдите на сайт для получения информации.", reply_markup = kbd)
            else:
                self.bot.reply_to(message, "Здравствуйте! Пожалуйста, используйте команду /start с корректными параметрами для подтверждения регистрации.")

        @self.bot.message_handler(func=lambda message: 'статус заявки' in message.text.lower())
        def handle_service_request_status(message):
            chat_id = message.chat.id
            client = Client.objects.filter(chat_id=chat_id).first()
            if client:
                service_requests = ServiceRequest.objects.filter(chat_id=client.chat_id)
                if service_requests.exists():
                    response = "Ваши заявки:\n"
                    for req in service_requests:
                        response += f"Номер заявки: {req.id}\n" \
                                    f"Услуга: {req.service.name}\n" \
                                    f"Дата создания: {req.created_at.strftime('%Y-%m-%d')}\n" \
                                    f"UID заявки: {req.token}\n"
                else:
                    response = "У вас нет активных заявок."
            else:
                response = "Клиент не найден. Пожалуйста, зарегистрируйтесь."
            self.bot.reply_to(message, response)

        @self.bot.message_handler(func=lambda message: 'статус заказа' in message.text.lower())
        def handle_order_status(message):
            chat_id = message.chat.id
            client = Client.objects.filter(chat_id=chat_id).first()
            if client:
                orders = Order.objects.filter(client=client)
                if orders.exists():
                    response = "Ваши заказы:\n"
                    for order in orders:
                        response += f"Номер заказа: {order.id}, Услуга: {order.service.name}, Статус: {order.get_status_display()}\n"
                else:
                    response = "У вас нет активных заказов."
            else:
                response = "Клиент не найден. Пожалуйста, зарегистрируйтесь."
            self.bot.reply_to(message, response)

        self.bot.polling(non_stop=True)

    def handle_confirm_command(self, message, match=None):
        chat_id = message.chat.id
        if not match:
            match = re.match(r'/start request_(\d+)_token_(.*)', message.text)
        if match:
            request_id = match.group(1)
            encoded_token = match.group(2)

            # Декодируем токен
            try:
                token = base64.urlsafe_b64decode(encoded_token + '==').decode('utf-8')
            except Exception as e:
                self.bot.send_message(chat_id, "Ошибка: Некорректный токен. Пожалуйста, повторите попытку позже.")
                return

            # Получаем заявку
            service_request = ServiceRequest.objects.filter(id=request_id, token=token).first()
            if service_request:
                # Обновляем chat_id клиента
                service_request.chat_id = chat_id
                service_request.client_name = message.from_user.first_name
                service_request.save()

                # Отправляем данные обратно на сервер для создания заявки
                data = {
                    "service_request_id": request_id,
                    "client_name": message.from_user.first_name,
                    "client_chat_id": chat_id
                }
                response = requests.post('http://localhost:8000/service/send_telegram_notification/', json=data)
                if response.status_code == 200:
                    self.bot.send_message(chat_id, "Ваш аккаунт успешно подтвержден! Вернитесь на сайт для продолжения.")
                else:
                    self.bot.send_message(chat_id, "Ошибка при подтверждении. Пожалуйста, повторите попытку позже.")
            else:
                self.bot.send_message(chat_id, "Ошибка: Неверная заявка или токен. Пожалуйста, проверьте ссылку.")

            self.bot.send_message(chat_id, response_message)
        else:
            response_message = "Ошибка: Некорректная команда. Пожалуйста, используйте ссылку, предоставленную на сайте для регистрации."
            self.bot.send_message(chat_id, response_message)

    def send_telegram_message(self, client_id, service_request_id, custom_message, order_id=None):
        # Get the client and service request from the database
        client = get_object_or_404(Client, pk=client_id)
        service_request = get_object_or_404(ServiceRequest, pk=service_request_id)
        chat_id = client.chat_id

        # Build the message content
        message = f"Здравствуйте, {client.first_name} {client.last_name}!\n"
        message += custom_message

        if order_id:
            order = get_object_or_404(Order, pk=order_id)
            message += f"\n\nДетали заказа:\nУслуга: {order.service.name}\nСтатус: {order.get_status_display()}\n"
        
        # Add service request details
        message += f"\nНомер заявки: {service_request.id}\nДата создания заявки: {service_request.created_at.strftime('%d-%m-%Y')}\n"

        # Send the message using the bot
        try:
            self.bot.send_message(chat_id, message)
        except Exception as e:
            logging.error(f"Ошибка при отправке сообщения в Telegram: {e}")

# Example usage:
# bot = TelegramBot()
# bot.start_bot_polling()
# bot.send_telegram_message(client_id=1, service_request_id=1, custom_message="Ваши данные для входа на сайт.")