import os
import sqlite3
import logging
from typing import Optional, Any
from contextlib import contextmanager

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.
    """
    _instance = None
    _db_path = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super(SQLiteDBManager, cls).__new__(cls)
            # Default path trỏ thẳng vào: backend/database/canifa_ai_dump.sqlite
            base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
            cls._instance._db_path = os.path.join(base_dir, "database", "canifa_ai_dump.sqlite")
        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

    def get_connection(self) -> sqlite3.Connection:
        """
        Khởi tạo và trả về 1 kết nối SQLite.
        Sử dụng check_same_thread=False để đảm bảo an toàn khi chạy trên đa luồng của FastAPI.
        """
        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 = sqlite3.connect(self._db_path, check_same_thread=False)
        # Row factory giúp lấy dữ liệu dưới dạng Dictionary (giống psycopg) thay vì Tuple index
        conn.row_factory = sqlite3.Row 
        return conn

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

    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."""
        with self.session() as conn:
            cursor = conn.cursor()
            cursor.execute(query, params)
            rows = cursor.fetchall()
            return [dict(row) for row in rows]

    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."""
        with self.session() as conn:
            cursor = conn.cursor()
            cursor.execute(query, params)
            row = cursor.fetchone()
            return dict(row) if row else None
            
    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."""
        with self.session() as conn:
            cursor = conn.cursor()
            cursor.execute(query, params)
            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()
