#!/usr/bin/env python3
"""Firmasett som lokal MCP-server (stdio, JSON-RPC) for Claude Desktop, Claude Code, Cursor og egne agenter.
Ingen avhengigheter utover Python 3. Kaller API-et med nøkkelen i FIRMASETT_NOKKEL; FIRMASETT_URL er
tjenesten (standard https://firmasett.arnu.io, lokalt http://127.0.0.1:5070).

    claude mcp add firmasett -e FIRMASETT_NOKKEL=fs_… -- python3 /sti/til/mcp_server.py

Den samme serveren finnes over HTTP på https://firmasett.arnu.io/mcp (Authorization: Bearer fs_…) eller
https://firmasett.arnu.io/mcp/fs_… for klienter som ikke kan sende hoder. Se /slik-virker-det/mcp.
"""
import json
import os
import sys
import urllib.error
import urllib.parse
import urllib.request

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from mcp_felles import VERKTOY, handter  # noqa: E402,F401

URL = os.environ.get("FIRMASETT_URL", "https://firmasett.arnu.io").rstrip("/")
NOKKEL = os.environ.get("FIRMASETT_NOKKEL", "")


def kall(metode, sti, params=None, kropp=None):
    url = URL + sti + ("?" + urllib.parse.urlencode({k: v for k, v in (params or {}).items() if v not in (None, "")}) if params else "")
    data = json.dumps(kropp).encode() if kropp is not None else None
    req = urllib.request.Request(url, data=data, method=metode, headers={"Authorization": "Bearer " + NOKKEL, "Content-Type": "application/json",
                                                                          "Accept": "application/json", "User-Agent": "firmasett-mcp/1.1"})
    try:
        with urllib.request.urlopen(req, timeout=120) as r:
            return json.load(r)
    except urllib.error.HTTPError as e:
        try:
            return json.load(e)
        except ValueError:
            return {"status": "feil", "feil": {"kode": str(e.code), "melding": e.reason}}
    except urllib.error.URLError as e:
        return {"status": "feil", "feil": {"kode": "nettverk", "melding": f"Fikk ikke kontakt med {URL}: {e.reason}"}}


def main():
    for linje in sys.stdin:
        linje = linje.strip()
        if not linje:
            continue
        try:
            m = json.loads(linje)
        except ValueError:
            continue
        ut = handter(m, kall)
        if ut is not None:
            sys.stdout.write(json.dumps(ut, ensure_ascii=False) + "\n")
            sys.stdout.flush()


if __name__ == "__main__":
    if not NOKKEL:
        sys.stderr.write("FIRMASETT_NOKKEL mangler — få en gratis på https://firmasett.arnu.io/konsoll\n")
    main()
