import asyncio
import sys
from dataclasses import dataclass
from pathlib import Path
from typing import Mapping, Optional

ROOT = Path(__file__).resolve().parent
DEFAULT_META_HOST = "127.0.0.1"
DEFAULT_META_PORT = 8787
DEFAULT_DB_PATH = str(ROOT / "db" / "open_autosecure.db")
DEFAULT_TELEMETRY_URL = "https://sten.wtf/api/oas/telemetry"


def prepare_runtime() -> None:
    if sys.platform == "win32":
        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())


def resolve_db_path(raw: str | None) -> str:
    if not raw:
        return DEFAULT_DB_PATH
    p = Path(raw)
    if p.is_absolute():
        return raw
    return str(ROOT / p)


prepare_runtime()


@dataclass
class InstanceConfig:
    instance_id: Optional[str]
    security_email: Optional[str]
    imap_host: Optional[str]
    imap_port: Optional[int]
    imap_user: Optional[str]
    imap_password: Optional[str]
    imap_auth: Optional[str]
    imap_provider: Optional[str]
    imap_refresh_token: Optional[str]
    telemetry_enabled: bool
    telemetry_url: Optional[str]
    proxy_url: Optional[str]
    build_version: Optional[str]
    meta_host: str
    meta_port: int
    db_path: str


def resolve(db_row: dict | None, env: Mapping[str, str]) -> InstanceConfig:
    row = db_row or {}

    meta_host = env.get("OAS_META_HOST") or DEFAULT_META_HOST
    meta_port = env.get("OAS_META_PORT") or DEFAULT_META_PORT
    db_path = resolve_db_path(env.get("OAS_DB_PATH"))

    imap_port = row.get("imap_port")
    configured = bool(row.get("instance_id") or row.get("security_email"))

    return InstanceConfig(
        instance_id=row.get("instance_id"),
        security_email=row.get("security_email"),
        imap_host=row.get("imap_host"),
        imap_port=int(imap_port) if imap_port is not None else None,
        imap_user=row.get("imap_user"),
        imap_password=row.get("imap_password"),
        imap_auth=row.get("imap_auth") or ("xoauth2" if row.get("imap_refresh_token") else "password"),
        imap_provider=row.get("imap_provider"),
        imap_refresh_token=row.get("imap_refresh_token"),
        telemetry_enabled=configured,
        telemetry_url=DEFAULT_TELEMETRY_URL if configured else None,
        proxy_url=row.get("proxy_url"),
        build_version=row.get("build_version"),
        meta_host=str(meta_host),
        meta_port=int(meta_port),
        db_path=str(db_path),
    )
