# apps/leave_form_app/api/v1/routes_aroflo.py
from __future__ import annotations

import os
import json
import subprocess
from flask import Blueprint, request, jsonify, current_app

aroflo_bp = Blueprint("leave_api_aroflo", __name__)

PROJECT_ROOT = "/var/www/html/flask_server"
PYTHON_BIN = os.getenv("VENV_PYTHON", f"{PROJECT_ROOT}/venv/bin/python")


@aroflo_bp.get("/businessunits")
def list_businessunits():
    pagesize = request.args.get("pagesize", "200")

    cmd = [
        PYTHON_BIN,
        "-m", "apps.aroflo_connector_app.cli",
        "businessunits", "list",
        "--pagesize", str(pagesize),
        "--raw",
    ]

    env = os.environ.copy()
    env["PYTHONPATH"] = PROJECT_ROOT + (":" + env["PYTHONPATH"] if env.get("PYTHONPATH") else "")

    current_app.logger.info("[leave_app] BU cmd=%s", " ".join(cmd))

    r = subprocess.run(
        cmd,
        cwd=PROJECT_ROOT,
        env=env,
        capture_output=True,
        text=True,
        timeout=45,
    )

    if r.returncode != 0:
        return jsonify({
            "status": "error",
            "message": "AroFlo businessunits CLI failed",
            "stderr": (r.stderr or "")[-2000:],
            "stdout": (r.stdout or "")[-2000:],
        }), 500

    payload = json.loads(r.stdout or "{}")

    # Normaliza sea cual sea el shape
    bu_list = []
    data = payload.get("data") or payload
    zoneresponse = data.get("zoneresponse") or data

    raw_items = zoneresponse.get("businessunits") or zoneresponse.get("businessUnits") or []
    for b in raw_items:
        name = (b.get("businessunitname") or b.get("name") or "").strip()
        if name:
            bu_list.append({"businessunitname": name})

    # Ordena opcionalmente
    bu_list.sort(key=lambda x: x["businessunitname"].lower())

    return jsonify({
        "status": "ok",
        "businessunits": bu_list,
        "count": len(bu_list),
    })
