export interface ResolvedDatabaseConfig {
    url: string | null
    host: string | null
    port: number | null
    user: string | null
    password: string | null
    database: string | null
}

function parseDatabaseUrl(value: string | undefined | null): ResolvedDatabaseConfig | null {
    const normalizedValue = value?.trim()
    if (!normalizedValue) {
        return null
    }

    try {
        const parsed = new URL(normalizedValue)
        return {
            url: normalizedValue,
            host: parsed.hostname || null,
            port: parsed.port ? Number(parsed.port) : null,
            user: parsed.username ? decodeURIComponent(parsed.username) : null,
            password: parsed.password ? decodeURIComponent(parsed.password) : null,
            database: parsed.pathname ? parsed.pathname.replace(/^\//u, "") || null : null,
        }
    } catch {
        return null
    }
}

export function resolveDatabaseConfigFromEnv(env: NodeJS.ProcessEnv = process.env): ResolvedDatabaseConfig {
    const parsedFromUrl = parseDatabaseUrl(env.DATABASE_URL)
    if (parsedFromUrl) {
        return parsedFromUrl
    }

    const host = env.DATABASE_HOST?.trim() || null
    const port = env.DATABASE_PORT?.trim() ? Number(env.DATABASE_PORT) : null
    const user = env.DATABASE_USER?.trim() || null
    const password = env.DATABASE_PASSWORD?.trim() || null
    const database = env.DATABASE_NAME?.trim() || null

    const url = host && user && database
        ? `mysql://${encodeURIComponent(user)}:${encodeURIComponent(password || "")}@${host}:${port || 3306}/${database}`
        : null

    return {
        url,
        host,
        port,
        user,
        password,
        database,
    }
}

