export function generateWireGuardConfig(
    privateKey: string,
    publicKey: string,
    subnet: string,
    address: string,
    endpoint: string,
    listenPort: string | number
): string {
    const addressWithoutCidr = address.split("/")[0];
    const port = typeof listenPort === "number" ? listenPort : listenPort;

    return `[Interface]
Address = ${subnet}
ListenPort = 51820
PrivateKey = ${privateKey}

[Peer]
PublicKey = ${publicKey}
AllowedIPs = ${addressWithoutCidr}/32
Endpoint = ${endpoint}:${port}
PersistentKeepalive = 5`;
}

export function generateObfuscatedWireGuardConfig(options?: {
    subnet?: string | null;
    address?: string | null;
    endpoint?: string | null;
    listenPort?: number | string | null;
    publicKey?: string | null;
}): string {
    const obfuscate = (
        value: string | null | undefined,
        length: number = 20
    ): string => {
        return value || "•".repeat(length);
    };

    const obfuscateKey = (value: string | null | undefined): string => {
        return value || "•".repeat(44); // Base64 key length
    };

    const subnet = options?.subnet || obfuscate(null, 20);
    const subnetWithCidr = subnet.includes("•")
        ? `${subnet}/32`
        : subnet.includes("/")
          ? subnet
          : `${subnet}/32`;
    const address = options?.address
        ? options.address.split("/")[0]
        : obfuscate(null, 20);
    const endpoint = obfuscate(options?.endpoint, 20);
    const listenPort = options?.listenPort
        ? typeof options.listenPort === "number"
            ? options.listenPort
            : options.listenPort
        : 51820;
    const publicKey = obfuscateKey(options?.publicKey);

    return `[Interface]
Address = ${subnetWithCidr}
ListenPort = 51820
PrivateKey = ${obfuscateKey(null)}

[Peer]
PublicKey = ${publicKey}
AllowedIPs = ${address}/32
Endpoint = ${endpoint}:${listenPort}
PersistentKeepalive = 5`;
}
