import socketio
from mods.log_control import VoiceChangaerLogger

from sio.MMVC_SocketIOServer import MMVC_SocketIOServer
from voice_changer.VoiceChangerManager import VoiceChangerManager
from const import getFrontendPath

logger = VoiceChangaerLogger.get_instance().getLogger()


class MMVC_SocketIOApp:
    _instance: socketio.ASGIApp | None = None

    @classmethod
    def get_instance(cls, app_fastapi, voiceChangerManager: VoiceChangerManager):
        if cls._instance is None:
            logger.info("[Voice Changer] MMVC_SocketIOApp initializing...")
            sio = MMVC_SocketIOServer.get_instance(voiceChangerManager)
            app_socketio = socketio.ASGIApp(
                sio,
                other_asgi_app=app_fastapi,
                static_files={
                    "/assets/icons/github.svg": {
                        "filename": f"{getFrontendPath()}/assets/icons/github.svg",
                        "content_type": "image/svg+xml",
                    },
                    "/assets/icons/help-circle.svg": {
                        "filename": f"{getFrontendPath()}/assets/icons/help-circle.svg",
                        "content_type": "image/svg+xml",
                    },
                    "/assets/icons/tool.svg": {
                        "filename": f"{getFrontendPath()}/assets/icons/tool.svg",
                        "content_type": "image/svg+xml",
                    },
                    "/assets/icons/folder.svg": {
                        "filename": f"{getFrontendPath()}/assets/icons/folder.svg",
                        "content_type": "image/svg+xml",
                    },
                    "/buymeacoffee.png": {
                        "filename": f"{getFrontendPath()}/assets/buymeacoffee.png",
                        "content_type": "image/png",
                    },
                    "/ort-wasm-simd.wasm": {
                        "filename": f"{getFrontendPath()}/ort-wasm-simd.wasm",
                        "content_type": "application/wasm",
                    },
                    "/assets/beatrice/female-clickable.svg": {
                        "filename": f"{getFrontendPath()}/assets/beatrice/female-clickable.svg",
                        "content_type": "image/svg+xml",
                    },
                    "/assets/beatrice/male-clickable.svg": {
                        "filename": f"{getFrontendPath()}/assets/beatrice/male-clickable.svg",
                        "content_type": "image/svg+xml",
                    },
                    "": f"{getFrontendPath()}",
                    "/": f"{getFrontendPath()}/index.html",
                },
            )

            cls._instance = app_socketio
            logger.info("[Voice Changer] MMVC_SocketIOApp initializing... done.")
            return cls._instance

        return cls._instance
