'use strict';

const os = require('os');
const ifaces = os.networkInterfaces();

const getLocalIp = () => {
    let localIp = '127.0.0.1';
    Object.keys(ifaces).forEach((ifname) => {
        for (const iface of ifaces[ifname]) {
            // Ignore IPv6 and 127.0.0.1
            if (iface.family !== 'IPv4' || iface.internal !== false) {
                continue;
            }
            // Set the local ip to the first IPv4 address found and exit the loop
            localIp = iface.address;
            return;
        }
    });
    return localIp;
};

function getIPv4() {
    const ifaces = os.networkInterfaces();
    for (const interfaceName in ifaces) {
        const iface = ifaces[interfaceName];
        for (const { address, family, internal } of iface) {
            if (family === 'IPv4' && !internal) {
                return address;
            }
        }
    }
    return '0.0.0.0'; // Default to 0.0.0.0 if no external IPv4 address found
}

const IPv4 = getIPv4();

const numWorkers = require('os').cpus().length;

// https://api.ipify.org

module.exports = {
    hostProtected: false,
    shortUrl: false,
    hostUsername: 'username',
    hostPassword: 'password',
    listenIp: '0.0.0.0',
    listenPort: 9002,
    // ssl/README.md
    sslCrt: '/SSL_CERT_PATH',
    sslKey: '/SSL_KEY_PATH',
    apiKeySecret: 'API_KEY_SECRET',
    publicFolder: 'public',
    audioLevelObserverEnabled: true,
    cors: '*',
    videoAi: {
        enabled: false,
        videoAvatar: '',
        apiKey: 'VIDEO_AVATAR_KEY',
        apiKeyStream: 'VIDEO_AVATAR_STREAM_KEY',
        serverUrl: 'https://api.heygen.com',
        systemLimit: 'You are a streaming avatar from LiveSmart Server Video, an industry-leading product that specialize in videos commnucations. Audience will try to have a conversation with you, please try answer the questions or respond their comments naturally, and concisely. - please try your best to response with short answers, and only answer the last question.'
    },
    elevenLabs: {
        enabled: true,
        apiKey: 'ELEVEN_LABS_KEY',
        serverUrl: 'https://api.elevenlabs.io',
        model: 'eleven_turbo_v2_5' //'eleven_multilingual_v2'
    },
    did: {
        enabled: false,
        apiKey: 'DID_VIDEO_AVATAR_KEY',
        serverUrl: 'https://api.d-id.com',
        model: 'eleven_turbo_v2_5' //'eleven_multilingual_v2'
    },
    openRouter: {
        enabled: false,
        apiKey: 'OPENROUTER_API_KEY',
        serverUrl: 'https://openrouter.ai/api/v1/completions'
    },
    anakinAi: {
        enabled: false,
        apiKey: 'ANAKIN_AI_KEY',
        serverUrl: 'https://api.anakin.ai/v1/chatbots'
    },
    chatGPT: {
        /**
        ChatGPT
            1. Goto https://platform.openai.com/
            2. Create your account
            3. Generate your APIKey https://platform.openai.com/account/api-keys
        */
        enabled: false,
        apiKey: 'CHAT_GPT_KEY',
        model: 'gpt-3.5-turbo',
        max_tokens: 1000,
        temperature: 0,
    },
    mediasoup: {
        // Worker settings
        numWorkers: Object.keys(os.cpus()).length,
        worker: {
            rtcMinPort: 40000,
            rtcMaxPort: 40100,
            logLevel: 'warn',
            logTags: ['info', 'ice', 'dtls', 'rtp', 'srtp', 'rtcp'],
        },
        // Router settings
        router: {
            mediaCodecs: [
                {
                    kind: 'audio',
                    mimeType: 'audio/opus',
                    clockRate: 48000,
                    channels: 2,
                },
                {
                    kind: 'video',
                    mimeType: 'video/VP8',
                    clockRate: 90000,
                    parameters: {
                        'x-google-start-bitrate': 1000,
                    },
                },
                {
                    kind: 'video',
                    mimeType: 'video/VP9',
                    clockRate: 90000,
                    parameters: {
                        'profile-id': 2,
                        'x-google-start-bitrate': 1000,
                    },
                },
                {
                    kind: 'video',
                    mimeType: 'video/h264',
                    clockRate: 90000,
                    parameters: {
                        'packetization-mode': 1,
                        'profile-level-id': '4d0032',
                        'level-asymmetry-allowed': 1,
                        'x-google-start-bitrate': 1000,
                    },
                },
                {
                    kind: 'video',
                    mimeType: 'video/h264',
                    clockRate: 90000,
                    parameters: {
                        'packetization-mode': 1,
                        'profile-level-id': '42e01f',
                        'level-asymmetry-allowed': 1,
                        'x-google-start-bitrate': 1000,
                    },
                },
            ],
        },
        webRtcServerOptions: {
            listenInfos: [
                {
                    protocol: 'udp',
                    ip: '0.0.0.0',
                    announcedAddress: IPv4,
                    portRange: { min: 40000, max: 40000 + numWorkers },
                },
                {
                    protocol: 'tcp',
                    ip: '0.0.0.0',
                    announcedAddress: IPv4,
                    portRange: { min: 40000, max: 40000 + numWorkers },
                },
            ],
        },
        // WebRtcTransport settings
        webRtcTransport: {
            listenIps: [
                {
                    ip: '0.0.0.0',
                    announcedIp: getLocalIp(), // replace by public static IP address https://api.ipify.org
                },
            ],
            listenInfos: [
                {
                    protocol: 'udp',
                    ip: '0.0.0.0',
                    announcedAddress: IPv4,
                    portRange: { min: 40000, max: 40100 },
                },
                {
                    protocol: 'tcp',
                    ip: '0.0.0.0',
                    announcedAddress: IPv4,
                    portRange: { min: 40000, max: 40100 },
                },
            ],
            initialAvailableOutgoingBitrate: 1000000,
            minimumAvailableOutgoingBitrate: 600000,
            maxSctpMessageSize: 262144,
            maxIncomingBitrate: 1500000,
        },
    },
};
