from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from apscheduler.schedulers.background import BackgroundScheduler
from model import DigitalTwinModel
from data_buffer import get_latest
from realtime_engine import run_realtime_engine

app = FastAPI(title="Digital Twin Suggestion Backend")

# Digital Twins
twins = {
    "fashion": DigitalTwinModel(),
    "retail": DigitalTwinModel(),
    "tech": DigitalTwinModel()
}


# ----------------------------
# AUTO REAL-TIME SCHEDULER
# ----------------------------
scheduler = BackgroundScheduler()
scheduler.add_job(
    lambda: run_realtime_engine(twins),
    "interval",
    seconds=5
)
scheduler.start()

# ----------------------------
# REQUEST SCHEMA
# ----------------------------
class MarketRequest(BaseModel):
    industry: str
    demand: float
    customers: float

# ----------------------------
# SUGGESTION API
# ----------------------------
@app.get("/suggest")
def get_suggestions(industry: str):
    industry = industry.lower()

    if industry not in twins:
        raise HTTPException(status_code=400, detail="Invalid industry")

    latest = get_latest(industry, 1)
    if not latest:
        return {
            "industry": industry,
            "active_trends": [],
            "competitors": [],
            "market_activity": "No data",
            "sentiment": "Unknown",
            "status": "success"
        }

    data = latest[0]
    twin = twins[industry]

    return {
        "industry": industry,
        "active_trends": twin.get_active_trends(
            industry,
            data["demand"],
            data["customers"]
        ),
        "competitors": twin.get_competitors(industry),
        "market_activity": twin.get_market_activity(
            data["demand"],
            data["customers"]
        ),
        "sentiment": twin.get_sentiment(
            data["demand"],
            data["customers"]
        ),
        "status": "success"
    }



# ----------------------------
# LIVE TREND API
# ----------------------------
@app.get("/live-trend")
def live_trend(industry: str):
    industry = industry.lower()

    if industry not in twins:
        raise HTTPException(status_code=400, detail="Invalid industry")

    return {
        "industry": industry,
        "recent_data": get_latest(industry, 10)
    }
