import Redis from "ioredis"

export function composeURL({
    host,
    port,
    username,
    password,
} = {}) {
    let url = "redis://"

    if (username && password) {
        url += username + ":" + password + "@"
    }

    url += host ?? "localhost"

    if (port) {
        url += ":" + port
    }

    return url
}

export default () => {
    let { REDIS_HOST, REDIS_PORT, REDIS_NO_AUTH, REDIS_AUTH, REDIS_DB } = process.env

    REDIS_NO_AUTH = ToBoolean(REDIS_NO_AUTH)

    let clientOptions = {
        host: REDIS_HOST,
        port: REDIS_PORT,
        lazyConnect: true,
        autoConnect: false
    }

    if (!REDIS_NO_AUTH) {
        if (REDIS_AUTH) {
            const [user, password] = REDIS_AUTH.split(":")

            clientOptions.username = user
            clientOptions.password = password
        }
    } else {
        console.log("⚠️ Redis auth is disabled")
    }

    if (REDIS_DB) {
        clientOptions.db = REDIS_DB
    }

    clientOptions = composeURL(clientOptions)

    let client = new Redis(clientOptions.host, clientOptions.port, clientOptions)

    client.on("error", (error) => {
        console.error("❌ Redis client error:", error)
    })

    client.on("connect", () => {
        console.log(`✅ Redis client connected [${process.env.REDIS_HOST}]`)
    })

    client.on("reconnecting", () => {
        console.log("🔄 Redis client reconnecting...")
    })

    const initialize = async () => {
        return await new Promise((resolve, reject) => {
            console.log(`🔌 Connecting to Redis client [${REDIS_HOST}]`)

            client.connect(resolve)
        })
    }

    return {
        client,
        initialize
    }
}