import 'dart:async';
import 'dart:io';
import 'package:angel3_framework/angel3_framework.dart';
import 'package:angel3_orm/angel3_orm.dart';
import 'package:angel3_orm_mysql/angel3_orm_mysql.dart';
import 'package:mysql1/mysql1.dart';
//import 'package:mysql_client/mysql_client.dart';

// For MariaDb
Future<void> configureServer(Angel app) async {
  try {
    var connection = await connectToMariaDb(app.configuration);
    var executor = MariaDbExecutor(connection, logger: app.logger);

    app
      ..container.registerSingleton<QueryExecutor>(executor)
      ..shutdownHooks.add((_) => connection.close());
  } catch (e) {
    app.logger.severe("Failed to connect to MariaDB. ORM disabled.", e);
  }
}

// MariaDB connection
Future<MySqlConnection> connectToMariaDb(Map configuration) async {
  var mariaDbConfig = configuration['mysql'] as Map? ?? {};
  var settings = ConnectionSettings(
      host: mariaDbConfig['host'] as String? ?? 'localhost',
      port: mariaDbConfig['port'] as int? ?? 3306,
      db: mariaDbConfig['database_name'] as String? ??
          Platform.environment['USER'] ??
          Platform.environment['USERNAME'] ??
          '',
      user: mariaDbConfig['username'] as String?,
      password: mariaDbConfig['password'] as String?,
      timeout: Duration(
          seconds: mariaDbConfig['timeout_in_seconds'] as int? ?? 30000),
      useSSL: mariaDbConfig['use_ssl'] as bool? ?? false);

  var connection = await MySqlConnection.connect(settings);
  return connection;
}

// For Mysql
/*
Future<void> configureServer(Angel app) async {
  try {
    var connection = await connectToMysql(app.configuration);
    var executor = MySqlExecutor(connection, logger: app.logger);

    app
      ..container.registerSingleton<QueryExecutor>(executor)
      ..shutdownHooks.add((_) => connection.close());
  } catch (e) {
    app.logger.severe("Failed to connect to MySQL. ORM disabled.", e);
  }
}

// Mysql Connection
Future<MySQLConnection> connectToMysql(Map configuration) async {
  var mysqlConfig = configuration['mysql'] as Map? ?? {};

  var connection = await MySQLConnection.createConnection(
      host: mysqlConfig['host'] as String? ?? 'localhost',
      port: mysqlConfig['port'] as int? ?? 3306,
      databaseName: mysqlConfig['database_name'] as String? ??
          Platform.environment['USER'] ??
          Platform.environment['USERNAME'] ??
          '',
      userName: mysqlConfig['username'] as String? ?? '',
      password: mysqlConfig['password'] as String? ?? '',
      secure: mysqlConfig['use_ssl'] as bool? ?? false);

  await connection.connect(timeoutMs: 10000);
  return connection;
}
*/