from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi.responses import RedirectResponse

from backend.database.database import SessionLocal
from backend.models import PlayerResources

import os

app = FastAPI()

templates = Jinja2Templates(directory="web/pages")

CSS_VERSION = int(os.path.getmtime("web/components/style.css"))

app.mount(
    "/src",
    StaticFiles(directory="web/components"),
    name="src",
)

@app.get("/")
def root():
    return RedirectResponse("bunker")

def build_resource_view_model(player_resources):
    resources = player_resources.resources or {}
    rates = player_resources.resource_rates or {}
    storage = player_resources.resource_storage or {}
    power_max = player_resources.total_power
    power_demand = player_resources.total_demand
    power_storage = player_resources.curr_power_storage
    efficiency = power_demand / power_max if power_max > 0 else 0

    return {
        "ore": {
            "current": resources.get("ore", 0),
            "rate": rates.get("ore", 0),
            "storage": storage.get("ore", 0),
        },

        "gas": {
            "current": resources.get("gas", 0),
            "rate": rates.get("gas", 0),
            "storage": storage.get("gas", 0),
        },

        "water": {
            "current": resources.get("water", 0),
            "rate": rates.get("water", 0),
            "storage": storage.get("water", 0),
        },

        "credits": {
            "current": player_resources.credits or 0,
            "rate": 0,
        },

        "power": {
            "current": power_demand or 0,
            "max": power_max or 0,
            "storage": power_storage or 0,
            "efficiency": efficiency,
        },
    }

def get_css_version():
    return int(os.path.getmtime("web/components/style.css"))

@app.get("/bunker")
def bunker(request: Request):
    db = SessionLocal()

    try:
        player_resources = (
            db.query(PlayerResources)
            .filter(PlayerResources.player_id == "admin")
            .first()
        )

        resource_view = build_resource_view_model(player_resources)

        return templates.TemplateResponse(
            request=request,
            name="bunker.html",
            context={
                "active_page": "bunker",
                "resources": resource_view,
                "css_version": get_css_version(),
            },
        )

    finally:
        db.close()