using Microsoft.Extensions.Logging;
using MySqlConnector;
using SharpChat.Configuration;
using SharpChat.Messages;
using SharpChat.Storage;
using ZLogger;

namespace SharpChat.MariaDB;

public class MariaDBStorage(ILogger logger, string connString) : StorageBackend {
    public async Task<MariaDBConnection> CreateConnection() {
        MySqlConnection conn = new(connString);
        await conn.OpenAsync();
        return new MariaDBConnection(conn);
    }

    public MessageStorage CreateMessageStorage() {
        return new MariaDBMessageStorage(this, logger);
    }

    public async Task UpgradeStorage() {
        logger.ZLogInformation($"Upgrading storage...");
        using MariaDBConnection conn = await CreateConnection();
        await new MariaDBMigrations(logger, conn).RunMigrations();
    }

    public static string BuildConnectionString(Config config) {
        return BuildConnectionString(
            config.ReadValue("host", "localhost"),
            config.ReadValue("user", string.Empty),
            config.ReadValue("pass", string.Empty),
            config.ReadValue("db", "sharpchat")
        );
    }

    public static string BuildConnectionString(string? host, string? username, string? password, string? database) {
        return new MySqlConnectionStringBuilder {
            Server = host,
            UserID = username,
            Password = password,
            Database = database,
            OldGuids = false,
            TreatTinyAsBoolean = false,
            CharacterSet = "utf8mb4",
            SslMode = MySqlSslMode.None,
            ForceSynchronous = false,
            ConnectionTimeout = 5,
            DefaultCommandTimeout = 900, // fuck it, 15 minutes
        }.ToString();
    }
}