from datetime import datetime

from pydantic import BaseModel, Field, model_validator

from openhands.agent_server.env_parser import DiscriminatedUnionMixin
from openhands.app_server.config_api.config_models import AppMode
from openhands.app_server.integrations.service_types import ProviderType
from openhands.app_server.web_client.web_client_deployment_mode import (
    DeploymentMode,
    get_deployment_mode,
)


class WebClientFeatureFlags(BaseModel):
    enable_billing: bool = False
    hide_llm_settings: bool = False
    enable_jira: bool = False
    enable_jira_dc: bool = False
    enable_linear: bool = False
    hide_users_page: bool = False
    hide_billing_page: bool = False
    hide_integrations_page: bool = False
    enable_acp: bool = False
    deployment_mode: DeploymentMode | None = None
    enable_onboarding: bool = False

    # This can be removed / replaced when a DeploymentMode (or similar) env var is created.
    @model_validator(mode='after')
    def set_deployment_mode(self) -> 'WebClientFeatureFlags':
        if self.deployment_mode is None:
            self.deployment_mode = get_deployment_mode()
        return self


class ACPProviderConfig(BaseModel):
    key: str
    display_name: str
    default_command: list[str]


class WebClientConfig(DiscriminatedUnionMixin):
    app_mode: AppMode
    posthog_client_key: str | None
    feature_flags: WebClientFeatureFlags
    providers_configured: list[ProviderType]
    maintenance_start_time: datetime | None
    auth_url: str | None
    recaptcha_site_key: str | None
    faulty_models: list[str]
    error_message: str | None
    updated_at: datetime
    github_app_slug: str | None
    gitlab_enabled: bool = False
    provider_default_hosts: dict[str, str] = Field(default_factory=dict)
    slack_enabled: bool = False
    acp_providers: list[ACPProviderConfig] = Field(default_factory=list)
    # Hostname of the Jira Data Center server when DC OAuth is configured, so the
    # configure form can pre-fill and lock the host field (the OAuth callback only
    # accepts this exact host). None in email-match mode / when DC isn't configured.
    jira_dc_oauth_host: str | None = None
    # Optional OpenHands Enterprise/KOTS-managed Jira DC service account. When
    # configured, the frontend hides the in-app service-account secret entry and
    # the backend always prefers the env credentials at runtime.
    jira_dc_service_account_managed: bool = False
    jira_dc_service_account_email: str | None = None
    jira_dc_service_account_config_error: str | None = None
