"""Cerebro MCP Server — entry point."""

import sys
from contextlib import asynccontextmanager

from mcp.server.fastmcp import FastMCP

from cerebro_mcp.tools import register_all_tools
from cerebro_mcp.resources.cerebro_resources import register_resources
from cerebro_mcp.prompts.workflows import register_prompts

SERVER_INSTRUCTIONS = """Cerebro MCP Server — доступ к платформе управления VFX-проектами Cerebro.

Навигация: get_projects → get_task_children → get_task для обхода дерева проектов.
Поиск: search_tasks, search_messages_in_project, search_attachments_in_project для поиска по проекту.
Модификация: create_task, set_task_status, add_report и другие для изменения данных.
Метаданные: get_activities, get_statuses, get_project_tags для справочников.
Аутентификация: если сервер не подключён, вызовите login(host, username, password).

Типы сообщений: 0=definition, 1=review, 2=report, 3=note, 4=client_review.
Приоритеты: -2=low, -1=below_normal, 0=normal, 1=above_normal, 2=high, 3=critical.
Даты: ISO формат (YYYY-MM-DD), конвертация автоматическая.
"""


@asynccontextmanager
async def lifespan(server):
    """Try to connect on startup. Non-fatal if not possible."""
    try:
        from cerebro_mcp.connection import get_db
        db = get_db()
        yield {"db": db}
    except Exception as e:
        print(f"Cerebro MCP: старт без подключения ({e}). Вызовите login().", file=sys.stderr)
        yield {}


mcp = FastMCP(
    "Cerebro MCP Server",
    instructions=SERVER_INSTRUCTIONS,
    lifespan=lifespan,
)

register_all_tools(mcp)
register_resources(mcp)
register_prompts(mcp)


def _run_server():
    """Run the MCP server (stdio transport)."""
    mcp.run(transport="stdio")


def main():
    """CLI entrypoint with subcommands."""
    if len(sys.argv) > 1:
        cmd = sys.argv[1]

        if cmd == "update-pycerebro":
            _cmd_update_pycerebro()
            return

        if cmd == "login":
            _cmd_login()
            return

        if cmd in ("--help", "-h"):
            _cmd_help()
            return

        if cmd == "--version":
            from cerebro_mcp import __version__
            print(f"cerebro-mcp {__version__}")
            return

        print(f"Неизвестная команда: {cmd}", file=sys.stderr)
        _cmd_help()
        sys.exit(1)

    # Default: run MCP server
    _run_server()


def _cmd_help():
    from cerebro_mcp import __version__
    print(f"cerebro-mcp {__version__}")
    print()
    print("Usage:")
    print("  cerebro-mcp              Запустить MCP сервер (stdio)")
    print("  cerebro-mcp login        Интерактивный вход в Cerebro")
    print("  cerebro-mcp update-pycerebro [--source PATH]")
    print("                           Обновить вендоренный pycerebro")
    print("  cerebro-mcp --version    Показать версию")


def _cmd_login():
    """Interactive login from terminal."""
    import getpass
    print("Вход в Cerebro")
    host = input("Host (например cerebro.mystudio.com): ").strip()
    username = input("Username: ").strip()
    password = getpass.getpass("Password: ")

    if not host or not username or not password:
        print("Ошибка: все поля обязательны", file=sys.stderr)
        sys.exit(1)

    try:
        from cerebro_mcp.auth import login
        login(host, username, password)
        print(f"Успешно подключено к {host} как {username}")
        print("Креды сохранены для будущих сессий.")
    except Exception as e:
        print(f"Ошибка входа: {e}", file=sys.stderr)
        sys.exit(1)


def _cmd_update_pycerebro():
    """Update vendored pycerebro from local Tentaculo installation."""
    import shutil
    from pathlib import Path
    import os

    source = None
    if len(sys.argv) > 2 and sys.argv[2] == "--source" and len(sys.argv) > 3:
        source = sys.argv[3]
    else:
        source = os.environ.get("CEREBRO_PYCEREBRO_PATH")

    if not source:
        print("Укажите путь к pycerebro:", file=sys.stderr)
        print("  cerebro-mcp update-pycerebro --source /path/to/ctentaculo/pycerebro", file=sys.stderr)
        print("  или установите CEREBRO_PYCEREBRO_PATH", file=sys.stderr)
        sys.exit(1)

    source_path = Path(source) / "pycerebro" if Path(source).name != "pycerebro" else Path(source)
    if not source_path.exists():
        print(f"Путь не найден: {source_path}", file=sys.stderr)
        sys.exit(1)

    vendor_dir = Path(__file__).parent / "_vendor" / "pycerebro"
    if vendor_dir.exists():
        shutil.rmtree(vendor_dir)
    shutil.copytree(source_path, vendor_dir)
    print(f"pycerebro обновлён из {source_path}")


if __name__ == "__main__":
    main()
