import logging
import os
from contextlib import asynccontextmanager
from typing import Optional

import aiosqlite

logger = logging.getLogger(__name__)

class SQLiteDBManager:
    """
    Quản lý kết nối tới file SQLite database (canifa_ai_dump.sqlite).
    Được thiết kế theo Singleton pattern để dùng thống nhất trong toàn bộ App FastAPI.
    Đã được chuyển đổi sang aiosqlite (bất đồng bộ).
    """
    _instance = None
    _db_path = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(SQLiteDBManager, cls).__new__(cls)
            from common.constants import SQLITE_DB_PATH
            cls._instance._db_path = SQLITE_DB_PATH
        return cls._instance

    @property
    def db_path(self) -> str:
        return self._db_path

    @db_path.setter
    def db_path(self, path: str):
        self._db_path = path

    async def get_connection(self) -> aiosqlite.Connection:
        """
        Khởi tạo và trả về 1 kết nối aiosqlite.
        """
        if not os.path.exists(self._db_path):
            logger.warning(f"[SQLite] Cảnh báo: File database không tồn tại tại {self._db_path}")
        
        conn = await aiosqlite.connect(self._db_path)
        # Row factory giúp lấy dữ liệu dưới dạng Dictionary
        conn.row_factory = aiosqlite.Row 
        return conn

    @asynccontextmanager
    async def session(self):
        """
        Context manager để tự động đóng Connection sau khi dùng xong.
        Sử dụng:
            async with sqlite_db.session() as conn:
                await conn.execute(...)
        """
        conn = await self.get_connection()
        try:
            yield conn
        finally:
            await conn.close()

    async def fetch_all(self, query: str, params: tuple = ()) -> list[dict]:
        """Hàm tiện ích: Lọc toàn bộ danh sách, trả về list chứa các dict."""
        async with self.session() as conn:
            async with conn.execute(query, params) as cursor:
                rows = await cursor.fetchall()
                return [dict(row) for row in rows]

    async def fetch_one(self, query: str, params: tuple = ()) -> Optional[dict]:
        """Hàm tiện ích: Lấy duy nhất 1 item đầu tiên, trả về dict."""
        async with self.session() as conn:
            async with conn.execute(query, params) as cursor:
                row = await cursor.fetchone()
                return dict(row) if row else None
            
    async def execute(self, query: str, params: tuple = ()) -> int:
        """Hàm tiện ích: Chạy các truy vấn INSERT/UPDATE/DELETE và trả về số dòng bị ảnh hưởng."""
        async with self.session() as conn:
            async with conn.execute(query, params) as cursor:
                await conn.commit()
                return cursor.rowcount

# Export một Singleton instance để các file khác import vào dùng luôn
# Cách dùng: from common.sqlite_db import sqlite_db
sqlite_db = SQLiteDBManager()
