"""Classroom Management System - Client Agent (CLI).

  python main.py register --server https://IP-GURU:8443 --key KUNCI [--ca server.crt]
  python main.py run [--dry-run]          # jalan di konsol (uji). Produksi: Windows Service (services/windows_service.py)
  python main.py status
  python main.py uninstall-policies       # hapus semua aturan firewall/hosts/registry (hanya admin lokal)
"""
from __future__ import annotations

import argparse
import asyncio
import logging
import sys
from logging.handlers import RotatingFileHandler
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parent))

from config import VERSION, Config, agent_home  # noqa: E402


def setup_logging(console: bool = True) -> None:
    h = [RotatingFileHandler(agent_home() / "agent.log", maxBytes=2_000_000, backupCount=3, encoding="utf-8")]
    if console:
        h.append(logging.StreamHandler())
    logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(name)s: %(message)s", handlers=h)


def main() -> int:
    ap = argparse.ArgumentParser(description="Classroom Management System - Client Agent")
    sub = ap.add_subparsers(dest="cmd", required=True)
    r = sub.add_parser("register")
    r.add_argument("--server", required=True)
    r.add_argument("--key", required=True)
    r.add_argument("--ca", default="")
    r.add_argument("--dry-run", action="store_true")
    r.add_argument("--applocker", action="store_true", help="aktifkan AppLocker (Windows Enterprise/Education)")
    r.add_argument("--protect-task-manager", action="store_true")
    run = sub.add_parser("run")
    run.add_argument("--dry-run", action="store_true")
    sub.add_parser("status")
    sub.add_parser("uninstall-policies")
    a = ap.parse_args()
    setup_logging()
    from services.agent_core import Agent

    cfg = Config.load()
    if a.cmd == "register":
        cfg.server_url, cfg.ca_file, cfg.dry_run = a.server.rstrip("/"), a.ca, a.dry_run
        cfg.applocker, cfg.protect_task_manager = a.applocker, a.protect_task_manager
        Agent.register(cfg, a.key)
        print(f"OK: komputer terdaftar (id={cfg.computer_id}). Versi agent {VERSION}.")
        return 0
    if a.cmd == "status":
        print({"server": cfg.server_url, "terdaftar": bool(cfg.token), "computer_id": cfg.computer_id, "dry_run": cfg.dry_run, "versi": VERSION})
        return 0
    if not cfg.token:
        print("Agent belum terdaftar. Jalankan: main.py register --server ... --key ...")
        return 2
    if a.cmd == "uninstall-policies":
        from modules.policy_engine import PolicyEngine
        from modules.winops import Ops
        PolicyEngine(Ops(cfg.dry_run)).clear_all()
        print("Penegakan dibersihkan.")
        return 0
    if a.cmd == "run":
        if a.dry_run:
            cfg.dry_run = True
        asyncio.run(Agent(cfg).run())
    return 0


if __name__ == "__main__":
    sys.exit(main())
