# backend/main.py
from fastapi import FastAPI, Depends, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy.orm import Session, joinedload
from typing import List

from . import models, schemas
from .database import engine, get_db

# Ta linia jest ważna - tworzy tabele, jeśli nie istnieją
models.Base.metadata.create_all(bind=engine)

app = FastAPI()

# Definicja dozwolonych źródeł
origins = [
    "https://masterstate.pl",
    "http://localhost",
    "http://127.0.0.1",
]

# Dodanie obsługi CORS
app.add_middleware(
    CORSMiddleware,
    allow_origins=origins,
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)


# --- ENDPOINTY API ---

# Endpoint: Pobierz listę wszystkich produktów
@app.get("/api/products", response_model=List[schemas.ProductInfo])
def get_products(db: Session = Depends(get_db)):
    products = db.query(models.Product).options(joinedload(models.Product.model)).all()
    return products

# ✨✨✨ TEN ENDPOINT PRAWDOPODOBNIE BYŁ BRAKUJĄCY ✨✨✨
# Endpoint: Stwórz nowy produkt (obsługuje metodę POST)
@app.post("/api/products", response_model=schemas.ProductInfo)
def create_product(product_data: schemas.ProductCreate, db: Session = Depends(get_db)):
    # Tworzy nowy obiekt produktu na podstawie danych z frontendu
    new_product = models.Product(**product_data.dict())
    db.add(new_product) # Dodaje go do sesji bazy danych
    db.commit()         # Zapisuje zmiany w bazie danych
    db.refresh(new_product) # Odświeża obiekt, aby uzyskać np. nowe ID
    print(f"STWORZONO: {new_product.name}")
    return new_product

# Endpoint: Zaktualizuj istniejący produkt
@app.put("/api/products/{product_id}", response_model=schemas.ProductInfo)
def update_product(product_id: int, product_data: schemas.ProductUpdate, db: Session = Depends(get_db)):
    db_product = db.query(models.Product).filter(models.Product.product_id == product_id).first()
    if not db_product:
        raise HTTPException(status_code=404, detail="Product not found")
    
    update_data = product_data.dict(exclude_unset=True)
    for key, value in update_data.items():
        setattr(db_product, key, value)
        
    db.commit()
    db.refresh(db_product)
    print(f"ZAKTUALIZOWANO: {db_product.name}")
    return db_product

# Endpoint: Usuń produkt
@app.delete("/api/products/{product_id}")
def delete_product(product_id: int, db: Session = Depends(get_db)):
    db_product = db.query(models.Product).filter(models.Product.product_id == product_id).first()
    if not db_product:
        raise HTTPException(status_code=404, detail="Product not found")
        
    db.delete(db_product)
    db.commit()
    print(f"USUNIĘTO: {db_product.name}")
    return {"status": "success", "message": "Product deleted"}