"""
Сервер для обработки Callback API ВКонтакте
"""

import os
import logging
from datetime import datetime
from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs
import json

# Настраиваем логирование
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('logs/callback_server.log', encoding='utf-8'),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

class CallbackHandler(BaseHTTPRequestHandler):
    """
    Обработчик HTTP запросов для Callback API
    """
    
    def do_GET(self):
        """Обработка GET запросов"""
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        self.wfile.write(b'Callback server is running')
    
    def do_POST(self):
        """Обработка POST запросов"""
        try:
            # Получаем длину тела запроса
            content_length = int(self.headers['Content-Length'])
            # Читаем тело запроса
            post_data = self.rfile.read(content_length)
            
            # Логируем сырой запрос
            logger.info(f"Получен запрос: {post_data.decode('utf-8')}")
            
            # Парсим JSON
            data = json.loads(post_data)
            
            # Логируем тип события
            event_type = data.get('type', 'unknown')
            logger.info(f"Тип события: {event_type}")
            
            # Обработка подтверждения сервера
            if event_type == 'confirmation':
                response = self.handle_confirmation(data)
            # Обработка других типов событий
            elif event_type == 'message_new':
                response = self.handle_message_new(data)
            elif event_type == 'wall_post_new':
                response = self.handle_wall_post_new(data)
            elif event_type == 'group_join':
                response = self.handle_group_join(data)
            elif event_type == 'group_leave':
                response = self.handle_group_leave(data)
            else:
                response = self.handle_unknown_event(data)
            
            # Отправляем ответ
            self.send_response(200)
            self.send_header('Content-type', 'text/plain')
            self.end_headers()
            self.wfile.write(response.encode('utf-8'))
            
        except Exception as e:
            logger.error(f"Ошибка обработки запроса: {e}", exc_info=True)
            self.send_response(500)
            self.send_header('Content-type', 'text/plain')
            self.end_headers()
            self.wfile.write(b'Internal Server Error')
    
    def handle_confirmation(self, data):
        """
        Обработка подтверждения сервера
        
        Args:
            data: Данные запроса
        
        Returns:
            Строка подтверждения
        """
        group_id = data.get('group_id')
        logger.info(f"Запрос на подтверждение сервера для группы: {group_id}")
        
        # Возвращаем строку подтверждения (указать свою)
        confirmation_string = "1955fce0"
        logger.info(f"Отправляем строку подтверждения: {confirmation_string}")
        
        return confirmation_string
    
    def handle_message_new(self, data):
        """
        Обработка нового сообщения
        
        Args:
            data: Данные запроса
        
        Returns:
            Строка ответа
        """
        logger.info("Получено новое сообщение")
        # Здесь можно добавить логику обработки сообщений
        return "ok"
    
    def handle_wall_post_new(self, data):
        """
        Обработка новой записи на стене
        
        Args:
            data: Данные запроса
        
        Returns:
            Строка ответа
        """
        logger.info("Новая запись на стене")
        # Здесь можно добавить логику обработки записей
        return "ok"
    
    def handle_group_join(self, data):
        """
        Обработка вступления в группу
        
        Args:
            data: Данные запроса
        
        Returns:
            Строка ответа
        """
        user_id = data.get('object', {}).get('user_id')
        logger.info(f"Пользователь {user_id} вступил в группу")
        # Здесь можно добавить логику приветствия нового участника
        return "ok"
    
    def handle_group_leave(self, data):
        """
        Обработка выхода из группы
        
        Args:
            data: Данные запроса
        
        Returns:
            Строка ответа
        """
        user_id = data.get('object', {}).get('user_id')
        logger.info(f"Пользователь {user_id} покинул группу")
        return "ok"
    
    def handle_unknown_event(self, data):
        """
        Обработка неизвестного события
        
        Args:
            data: Данные запроса
        
        Returns:
            Строка ответа
        """
        event_type = data.get('type', 'unknown')
        logger.info(f"Получено неизвестное событие: {event_type}")
        return "ok"

def run_server(port=82):
    """
    Запуск сервера
    
    Args:
        port: Порт для прослушивания
    """
    server_address = ('', port)
    httpd = HTTPServer(server_address, CallbackHandler)
    logger.info(f"Сервер запущен на порту {port}")
    
    try:
        httpd.serve_forever()
    except KeyboardInterrupt:
        logger.info("Остановка сервера...")
        httpd.shutdown()

if __name__ == "__main__":
    # Создаем директорию для логов, если ее нет
    os.makedirs('logs', exist_ok=True)
    
    # Устанавливаем абсолютный путь для логов
    log_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logs', 'callback_server.log')
    
    # Проверяем, можем ли мы писать в файл логов
    try:
        with open(log_path, 'a', encoding='utf-8') as f:
            f.write(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} - __main__ - INFO - Лог-файл инициализирован\n")
    except Exception as e:
        print(f"Ошибка при создании лог-файла: {e}")
        raise
    
    # Запускаем сервер
    run_server()