import 'dart:io';

import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:path_provider/path_provider.dart';

/// 管理每个用户对应的 SQLite 文件连接。
///
/// [databaseFactory] 由调用方（App 层）提供，负责把 [QueryExecutor]
/// 包装成具体的 [GeneratedDatabase] 子类（含表定义和迁移策略）。
///
/// 这样 storage_sdk 只负责连接机制，不感知业务表结构。
///
/// 示例：
/// ```dart
/// final ds = DatabaseDataSource(
///   databaseFactory: (executor) => AppDatabase(executor),
/// );
/// await ds.openDatabase(userId);
/// ```
class DatabaseDataSource {
  final GeneratedDatabase Function(QueryExecutor) _databaseFactory;

  DatabaseDataSource({
    required GeneratedDatabase Function(QueryExecutor) databaseFactory,
  }) : _databaseFactory = databaseFactory;

  GeneratedDatabase? _db;

  /// 当前已打开的数据库实例；未开库时为 null。
  GeneratedDatabase? get current => _db;

  /// 打开指定用户的数据库文件，若已有连接则先关闭。
  ///
  /// 数据库文件路径：`<ApplicationSupport>/../databases/<uid>.sqlite`
  Future<GeneratedDatabase> openDatabase(int uid) async {
    await _db?.close();
    _db = null;

    ///TODO: iOS路径
    final dir = await getApplicationSupportDirectory();
    final dbDir = Directory('${dir.parent.path}/databases');
    if (!dbDir.existsSync()) {
      dbDir.createSync(recursive: true);
    }

    final file = File('${dbDir.path}/$uid.sqlite');
    _db = _databaseFactory(NativeDatabase.createInBackground(file));
    return _db!;
  }

  /// 关闭当前数据库连接并清空引用。
  Future<void> closeDatabase() async {
    await _db?.close();
    _db = null;
  }
}
