import sqlite3
import aiosqlite
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,
            user_id TEXT NOT NULL,
            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(access_token, refresh_token,login=None, user_id=None, update_existing=False, old_access_token=None, old_refresh_token=None):
    """Добавляет новую сессию или обновляет существующую."""
    conn = get_connection()
    cursor = conn.cursor()

    #print("ffff", login, access_token, refresh_token, user_id, update_existing)
    
    if update_existing:
        # Обновляем существующую сессию по access_token
        cursor.execute('''
            UPDATE sessions 
            SET access_token = ?, refresh_token = ?
            WHERE access_token = ? AND refresh_token = ?
        ''', (access_token, refresh_token, old_access_token, old_refresh_token))
    else:
        # Вставляем новую или заменяем существующую по логину
        cursor.execute('''
            INSERT OR REPLACE INTO sessions (login, user_id, access_token, refresh_token, created_at)
            VALUES (?, ?, ?, ?, ?)
        ''', (login, user_id, access_token, refresh_token, datetime.now()))
    
    conn.commit()
    conn.close()

def logout(access_token: str):
    """Удаляет сессию по токену доступа."""
    conn = get_connection()
    cursor = conn.cursor()
    cursor.execute('DELETE FROM sessions WHERE access_token = ?', (access_token,))
    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 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()

# def get_current_access_token():
#     """
#     Получает access_token для последней активной сессии.
#     :return: access_token или None, если сессия не найдена.
#     """
#     last_login = get_last_login()
#     if not last_login:
#         return None
    
#     session = get_session(last_login)
#     return session['access_token'] if session else None

async def get_current_access_token():
    async with aiosqlite.connect(DB_PATH) as db:
        db.row_factory = aiosqlite.Row
        async with db.execute("SELECT value FROM app_state WHERE key = 'last_login'") as cur:
            row = await cur.fetchone()
            if not row:
                return None
            last_login = row[0]
        async with db.execute('SELECT access_token FROM sessions WHERE login = ?', (last_login,)) as cur:
            row = await cur.fetchone()
            return row[0] if row else None
