# retoor <retoor@molodetz.nl>

from datetime import timedelta
import pytest
import requests
from tests.conftest import BASE_URL, run_async
from devplacepy.database import db, get_table, init_db, refresh_snapshot
from devplacepy import config, project_files
from devplacepy.services.containers import api, store, runtime
from devplacepy.services.containers.backend.base import Mount, PortMapping, RunSpec
from devplacepy.services.containers.backend.docker_cli import build_run_argv, parse_size
from devplacepy.services.containers.backend.fake import FakeBackend
from devplacepy.services.containers.service import ContainerService
from devplacepy.services.containers.api import INSTANCE_LABEL
from devplacepy.services.devii.tasks.schedule import Schedule, now_utc
_CONTAINER_TABLES = (
    "instances",
    "instance_events",
    "instance_metrics",
    "instance_schedules",
)
@pytest.fixture(autouse=True)
def _init_db_containers():
    init_db()
    yield
@pytest.fixture
def env(tmp_path, monkeypatch):
    fake = FakeBackend()
    runtime.set_backend(fake)
    monkeypatch.setattr("devplacepy.config.CONTAINER_WORKSPACES_DIR", tmp_path / "ws")
    pid = "ctest-p1"
    project = {"uid": pid, "slug": "ctest", "title": "C", "user_uid": "ctest-u1"}
    user = {"uid": "ctest-u1", "username": "ctestadmin"}
    project_files.write_text_file(pid, user, "app.py", "print(1)\n")
    yield {"fake": fake, "project": project, "user": user}
    runtime.set_backend(None)
    for table in _CONTAINER_TABLES:
        if table in db.tables:
            for row in [r for r in get_table(table).find()]:
                if str(row.get("project_uid", "")).startswith("ctest"):
                    get_table(table).delete(uid=row["uid"])
    for row in list(get_table("project_files").find()):
        if str(row.get("project_uid", "")).startswith("ctest"):
            get_table("project_files").delete(uid=row["uid"])
def _ready_instance(env, **kwargs):
    return run_async(
        api.create_instance(env["project"], name=kwargs.pop("name", "inst"), **kwargs)
    )
def _promote_admin(username: str) -> None:
    users = get_table("users")
    user = users.find_one(username=username)
    if user:
        users.update({"uid": user["uid"], "role": "Admin"}, ["uid"])
def _api_key(username: str) -> str:
    refresh_snapshot()
    return get_table("users").find_one(username=username)["api_key"]


def test_http_non_admin_forbidden(app_server, page, seeded_db):
    project = requests.post(
        f"{BASE_URL}/projects/create",
        headers={"X-API-KEY": _api_key("bob_test"), "Accept": "application/json"},
        data={
            "title": "NoAdmin",
            "description": "x",
            "project_type": "software",
            "status": "s",
        },
    )
    slug = project.json()["data"]["slug"] or project.json()["data"]["uid"]
    r = requests.get(
        f"{BASE_URL}/projects/{slug}/containers/data",
        headers={"X-API-KEY": _api_key("bob_test"), "Accept": "application/json"},
    )
    assert r.status_code == 403
