import sqlite3
import os
from datetime import datetime

DB_PATH = "messenger.db"

def get_connection():
    """Получает соединение с базой данных."""
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row # Для доступа к колонкам по имени
    return conn

def init_db():
    """Инициализирует базу данных и создает таблицы, если они не существуют."""
    conn = get_connection()
    cursor = conn.cursor()

    # Создаем таблицу для чатов (если ее нет)
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS chats (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            title TEXT NOT NULL
        )
    ''')

    # Создаем таблицу для сессий
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS sessions (
            login TEXT PRIMARY KEY,
            access_token TEXT NOT NULL,
            refresh_token TEXT NOT NULL,
            created_at TIMESTAMP NOT NULL
        )
    ''')

    # Создаем таблицу для хранения состояния приложения (ключ-значение)
    cursor.execute('''
        CREATE TABLE IF NOT EXISTS app_state (
            key TEXT PRIMARY KEY,
            value TEXT NOT NULL
        )
    ''')

    # Проверяем, есть ли в chats тестовые данные
    cursor.execute("SELECT COUNT(*) FROM chats")
    if cursor.fetchone()[0] == 0:
        cursor.execute('INSERT INTO chats (title) VALUES (?)', ("Чат с Alice",))

    conn.commit()
    conn.close()

def add_session(login, access_token, refresh_token):
    """Добавляет новую сессию или обновляет существующую."""
    conn = get_connection()
    cursor = conn.cursor()
    # REPLACE INTO - удобный способ для вставки или обновления
    cursor.execute('''
        INSERT OR REPLACE INTO sessions (login, access_token, refresh_token, created_at)
        VALUES (?, ?, ?, ?)
    ''', (login, access_token, refresh_token, datetime.now()))
    conn.commit()
    conn.close()

def get_session(login: str):
    """Получает сессию по логину."""
    conn = get_connection()
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM sessions WHERE login = ?', (login,))
    session = cursor.fetchone()
    conn.close()
    return session

def get_all_sessions():
    """Получает все сессии, отсортированные по дате создания (сначала новые)."""
    conn = get_connection()
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM sessions ORDER BY created_at DESC')
    sessions = cursor.fetchall()
    conn.close()
    return sessions

def delete_session(login: str):
    """Удаляет сессию по логину."""
    conn = get_connection()
    cursor = conn.cursor()
    cursor.execute('DELETE FROM sessions WHERE login = ?', (login,))
    conn.commit()
    conn.close()

def get_last_login():
    """Получает логин последнего вошедшего пользователя."""
    conn = get_connection()
    cursor = conn.cursor()
    cursor.execute("SELECT value FROM app_state WHERE key = 'last_login'")
    result = cursor.fetchone()
    conn.close()
    return result['value'] if result else None

def set_last_login(login: str):
    """Сохраняет логин последнего вошедшего пользователя."""
    conn = get_connection()
    cursor = conn.cursor()
    cursor.execute("INSERT OR REPLACE INTO app_state (key, value) VALUES ('last_login', ?)", (login,))
    conn.commit()
    conn.close()
