"""Organization CRUD."""

from fastapi import APIRouter, Form, HTTPException, Request
from fastapi.responses import HTMLResponse, RedirectResponse

from db import execute, query, query_one
from deps import audit, render, require_internal

router = APIRouter(prefix="/orgs")


@router.get("", response_class=HTMLResponse)
def orgs_list(request: Request):
    user = require_internal(request)
    rows = query(
        """SELECT o.id, o.name, o.kind, o.created_at,
                  (SELECT COUNT(*) FROM client c WHERE c.organization_id = o.id) AS n_clients
           FROM organization o ORDER BY o.name"""
    )
    return render("orgs_list.html", user=user, orgs=rows)


@router.get("/new", response_class=HTMLResponse)
def org_new_form(request: Request, error: str = ""):
    user = require_internal(request)
    return render("org_new.html", user=user, error=error)


@router.post("/new")
def org_new_submit(request: Request, name: str = Form(...), kind: str = Form(...)):
    user = require_internal(request)
    name = name.strip()
    if not name:
        return render("org_new.html", user=user, error="Name is required.")
    if kind not in ("master", "single_client"):
        return render("org_new.html", user=user, error="Invalid kind.")
    if query_one("SELECT id FROM organization WHERE name = ?", (name,)):
        return render("org_new.html", user=user,
                      error="An organization with that name already exists.")
    org_id = execute(
        "INSERT INTO organization (name, kind) VALUES (?, ?)", (name, kind)
    )
    audit(user.id, None, "org.create", {"org_id": org_id, "name": name, "kind": kind})
    return RedirectResponse(f"/orgs/{org_id}", status_code=303)


@router.get("/{org_id}", response_class=HTMLResponse)
def org_detail(request: Request, org_id: int):
    user = require_internal(request)
    org = query_one(
        "SELECT id, name, kind, created_at FROM organization WHERE id = ?", (org_id,)
    )
    if not org:
        raise HTTPException(404)
    clients = query(
        """SELECT id, name, primary_url, status, created_at
           FROM client WHERE organization_id = ? ORDER BY created_at DESC""",
        (org_id,),
    )
    return render("org_detail.html", user=user, org=org, clients=clients)
