import base64
import json
import os
from typing import Generator

from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

os.environ.setdefault("WEB_SENTINEL_POSTGRES_URL", "sqlite:///./test_admin_maintenance.db")
os.environ.setdefault("WEB_SENTINEL_ADMIN_JWT_SECRET", "test-secret")

from admin.backend.app.database import get_session
from admin.backend.app.main import create_app
from admin.backend.app.models import Base
from admin.backend.app.models.admin_user import AdminUser
from admin.backend.app.security import hash_password

engine = create_engine(os.environ["WEB_SENTINEL_POSTGRES_URL"], future=True)
Session = sessionmaker(bind=engine, autoflush=False, autocommit=False, future=True)

Base.metadata.create_all(bind=engine)

def override_session() -> Generator:
    db = Session()
    try:
        yield db
    finally:
        db.close()

app = create_app()
app.dependency_overrides[get_session] = override_session
client = TestClient(app)


def setup_module() -> None:
    Base.metadata.create_all(bind=engine)
    with Session() as session:
        session.query(AdminUser).delete()
        session.add(AdminUser(email="sysop@web-sentinel.com", hashed_password=hash_password("secret"), role="super-admin"))
        session.commit()


def teardown_module() -> None:
    Base.metadata.drop_all(bind=engine)


def _login() -> str:
    resp = client.post(
        "/api/v1/auth/login",
        data={"username": "sysop@web-sentinel.com", "password": "secret"},
        headers={"Content-Type": "application/x-www-form-urlencoded"},
    )
    assert resp.status_code == 200
    return resp.json()["access_token"]


def test_maintenance_endpoints():
    token = _login()
    rotate = client.post(
        "/api/v1/maintenance/rotate-keys",
        headers={"Authorization": f"Bearer {token}"},
    )
    assert rotate.status_code == 200
    maintenance = client.post(
        "/api/v1/maintenance/maintenance-mode",
        params={"enable": True},
        headers={"Authorization": f"Bearer {token}"},
    )
    assert maintenance.status_code == 200


def test_manual_backup_snapshot():
    token = _login()
    response = client.post(
        "/api/v1/maintenance/backups",
        headers={"Authorization": f"Bearer {token}"},
    )
    assert response.status_code == 200
    payload = response.json()
    content = json.loads(base64.b64decode(payload["content_base64"]))
    assert "licenses" in content
