from fastapi import FastAPI, File, UploadFile
from fastapi.middleware.cors import CORSMiddleware
from pyairtable import Table
import pandas as pd
import io

app = FastAPI()

# CORS (optional - allow from all origins)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # Replace with your frontend domain for security
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Airtable credentials (replace with your actual values)
AIRTABLE_API_KEY = "patxeXDdZuJZIfTr7.734a61f1569b3a858451002068d5e0a7a47c23cfb96faa101284dc09a65f341a"
BASE_ID = "apphI6IdboDIR9P0l"
TABLE_NAME = "ProductsV2"

table = Table(AIRTABLE_API_KEY, BASE_ID, TABLE_NAME)

def sanitize(value):
    """Convert problematic float or NaN to None."""
    if pd.isna(value) or value in [float("inf"), float("-inf")]:
        return None
    return value

@app.post("/upload-sdr")
async def upload_sdr(file: UploadFile = File(...)):
    try:
        contents = await file.read()
        df = pd.read_csv(io.StringIO(contents.decode("utf-8")))

        upserted = 0

        for _, row in df.iterrows():
            tm_id = sanitize(row.get("TM ARTICLE NUMBER"))
            if not tm_id:
                continue

            fields = {
                "TM Article Number": tm_id,
                "Product Line": sanitize(row.get("PRODUCT LINE")),
                "Subfamily": sanitize(row.get("SUBFAMILY")),
                "Style Name": sanitize(row.get("STYLE NAME")),
                "OG Style Name": sanitize(row.get("OG STYLE NAME")),
                "Color Name": sanitize(row.get("COLOR  NAME")),  # Note: column name has double spaces
                "Season": sanitize(row.get("SEASON")),
                "PAR Date": sanitize(row.get("PAR Date")),
                "Number of Samples Received": sanitize(row.get("Number of Samples Received")),
                "Marketing Sample Estimated Date": sanitize(row.get("Marketing Sample Estimated Date")),
                "Rep SMS/Photoshop Comments": sanitize(row.get("Rep SMS/Photoshop Comments")),
                "Location": sanitize(row.get("LOCATION")),
                "Sample Pass off Date": sanitize(row.get("Sample Pass off Date")),
                "Lionshead Received Date": sanitize(row.get("Lionshead Received Date")),
                "Flatlay Shoot Date": sanitize(row.get("Flatlay Shoot Date")),
                "On Model Shoot Date": sanitize(row.get("On Model Shoot Date")),
                "On Models Shot": sanitize(row.get("On Models Shot (Y or N)")),
                "Sample Return Date": sanitize(row.get("Sample Return Date")),
                "Last Updated DateTime": sanitize(row.get("Last Updated DateTime")),
                "Updated By": sanitize(row.get("Updated By")),
            }

            existing = table.all(formula=f"{{TM Article Number}} = '{tm_id}'")

            if existing:
                table.update(existing[0]["id"], fields)
            else:
                table.create(fields)

            upserted += 1

        return {"status": "success", "upserted": upserted}

    except Exception as e:
        return {"status": "error", "message": str(e)}