from logging import getLogger
from typing import Optional, Set

from defence360agent.api.integration_conf import IntegrationConfig
from defence360agent.subsys.panels.generic import GenericPanel as Base
from defence360agent.subsys.panels.generic.panel import (
    get_integration_data,
)
from im360.subsys.int_config import is_force_use_coraza
from im360.subsys.panels.base import PanelInterface
from im360.subsys.panels.coraza_modsecurity import CorazaModSecurity
from .mod_security import GenericPanelModSecurity

log = getLogger(__name__)


class _GenericPanelBase:
    pure_ftp_conf_cls = None

    async def _get_all_admin_emails(self) -> list:
        # Used only as a suggestion in UI for the ADMIN_CONTACTS.emails
        # same as https://docs.cloudlinux.com/control_panel_integration/#admins
        admins = await get_integration_data("admins")
        for admin in admins:
            if admin["is_main"] and admin.get("email"):
                return [admin["email"]]
        return []

    def http_ports(self) -> Set[int]:
        # Not needed since there is no WebShield, graylist, CAPTCHA
        return set()

    def https_ports(self) -> Set[int]:
        # Not needed since there is no WebShield, graylist, CAPTCHA
        return set()

    def remoteip_supported(self) -> bool:
        # Used to decide whether HostingPanel interface should be used for
        # installation, removal, and configuration of mod_remoteip.
        # Not needed since we will require it to be installed and configured.
        return False

    async def get_web_server(self) -> Optional[str]:
        return IntegrationConfig.get("web_server", "server_type")


class _CorazaDriven(
    Base,
    _GenericPanelBase,
    PanelInterface,
    CorazaModSecurity,
):
    @staticmethod
    def _is_dns_only():
        return False


class GenericPanel(
    Base,
    _GenericPanelBase,
    PanelInterface,
    # Remote IP should be installed/removed by admin, manually.
    # GenericRemoteIPInterface,
    GenericPanelModSecurity,
):
    def __new__(cls):
        if is_force_use_coraza():
            log.info("Autodetect, creating Coraza-driven panel.")
            return _CorazaDriven()
        log.info("Autodetect, creating standard GenericPanel.")
        return super().__new__(cls)
