# database.py - Работа с базой данных

import sqlite3
from datetime import datetime
from config import DATABASE_PATH, WINNERS_TXT_PATH, STREAM_STATS_TXT_PATH


class Database:
    def __init__(self):
        self.conn = None
        self.cursor = None
        self.init_database()

    def init_database(self):
        """Инициализация базы данных"""
        try:
            self.conn = sqlite3.connect(DATABASE_PATH, check_same_thread=False)
            self.cursor = self.conn.cursor()

            # Таблица победителей
            self.cursor.execute('''
                CREATE TABLE IF NOT EXISTS winners (
                    ID INTEGER PRIMARY KEY AUTOINCREMENT,
                    Date_Time TEXT NOT NULL,
                    Winner TEXT NOT NULL,
                    TradeOffer TEXT NOT NULL
                )
            ''')

            # Таблица статистики стримов
            self.cursor.execute('''
                CREATE TABLE IF NOT EXISTS stream_stats (
                    ID INTEGER PRIMARY KEY AUTOINCREMENT,
                    Stream_Start TEXT NOT NULL,
                    Stream_End TEXT NOT NULL,
                    Stream_Duration TEXT NOT NULL,
                    Total_Messages INTEGER NOT NULL,
                    Active_Users TEXT NOT NULL
                )
            ''')

            self.conn.commit()
            print("✅ [DATABASE] База данных инициализирована")
            print("📊 [DATABASE] Таблицы: winners, stream_stats")
        except Exception as e:
            print(f"❌ [DATABASE] Ошибка инициализации: {e}")

    def save_winner(self, winner, trade_link):
        """Сохранение победителя в БД и TXT"""
        try:
            date_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

            # Сохраняем в SQLite
            self.cursor.execute('''
                INSERT INTO winners (Date_Time, Winner, TradeOffer)
                VALUES (?, ?, ?)
            ''', (date_time, winner, trade_link))
            self.conn.commit()

            # Сохраняем в TXT
            with open(WINNERS_TXT_PATH, 'a', encoding='utf-8') as f:
                f.write(f"{date_time} | {winner} | {trade_link}\n")

            print(f"💾 [DATABASE] Победитель сохранён: {winner}")
            return True
        except Exception as e:
            print(f"❌ [DATABASE] Ошибка сохранения победителя: {e}")
            return False

    def save_stream_stats(self, stream_start_time, total_messages, active_users):
        """Сохранение статистики стрима"""
        try:
            stream_end = datetime.now()
            duration = stream_end - stream_start_time

            hours = int(duration.total_seconds() // 3600)
            minutes = int((duration.total_seconds() % 3600) // 60)
            duration_str = f"{hours}ч {minutes}м"

            users_list = ", ".join(sorted(active_users))

            # Сохраняем в SQLite
            self.cursor.execute('''
                INSERT INTO stream_stats (Stream_Start, Stream_End, Stream_Duration, Total_Messages, Active_Users)
                VALUES (?, ?, ?, ?, ?)
            ''', (
                stream_start_time.strftime("%Y-%m-%d %H:%M:%S"),
                stream_end.strftime("%Y-%m-%d %H:%M:%S"),
                duration_str,
                total_messages,
                users_list
            ))
            self.conn.commit()

            # Сохраняем в TXT
            with open(STREAM_STATS_TXT_PATH, 'a', encoding='utf-8') as f:
                f.write(f"\n{'=' * 80}\n")
                f.write(
                    f"Стрим: {stream_start_time.strftime('%Y-%m-%d %H:%M:%S')} - {stream_end.strftime('%H:%M:%S')}\n")
                f.write(f"Длительность: {duration_str}\n")
                f.write(f"Всего сообщений: {total_messages}\n")
                f.write(f"Активных пользователей: {len(active_users)}\n")
                f.write(f"Список: {users_list}\n")
                f.write(f"{'=' * 80}\n")

            print(f"💾 [DATABASE] Статистика стрима сохранена")
            return True
        except Exception as e:
            print(f"❌ [DATABASE] Ошибка сохранения статистики: {e}")
            return False

    def get_all_winners(self):
        """Получить всех победителей"""
        try:
            self.cursor.execute("SELECT * FROM winners ORDER BY ID DESC")
            return self.cursor.fetchall()
        except Exception as e:
            print(f"❌ [DATABASE] Ошибка получения победителей: {e}")
            return []

    def get_last_winners(self, limit=10):
        """Получить последних N победителей"""
        try:
            self.cursor.execute(f"SELECT * FROM winners ORDER BY ID DESC LIMIT {limit}")
            return self.cursor.fetchall()
        except Exception as e:
            print(f"❌ [DATABASE] Ошибка получения последних победителей: {e}")
            return []

    def get_all_stream_stats(self):
        """Получить всю статистику стримов"""
        try:
            self.cursor.execute("SELECT * FROM stream_stats ORDER BY ID DESC")
            return self.cursor.fetchall()
        except Exception as e:
            print(f"❌ [DATABASE] Ошибка получения статистики: {e}")
            return []

    def get_total_stats(self):
        """Получить общую статистику"""
        try:
            self.cursor.execute("SELECT COUNT(*) FROM winners")
            winners_count = self.cursor.fetchone()[0]

            self.cursor.execute("SELECT COUNT(*) FROM stream_stats")
            streams_count = self.cursor.fetchone()[0]

            self.cursor.execute("SELECT SUM(Total_Messages) FROM stream_stats")
            total_messages = self.cursor.fetchone()[0] or 0

            return {
                "winners_count": winners_count,
                "streams_count": streams_count,
                "total_messages": total_messages
            }
        except Exception as e:
            print(f"❌ [DATABASE] Ошибка получения общей статистики: {e}")
            return None

    def close(self):
        """Закрыть соединение с БД"""
        if self.conn:
            self.conn.close()
            print("👋 [DATABASE] Соединение закрыто")