from fastapi import Depends, FastAPI, HTTPException, status
from sqlalchemy.orm import Session
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
import schemas, models
from transformers import pipeline
import database

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

models.database.Base.metadata.create_all(bind=database.engine)
pipe = pipeline("text-classification", model="lxyuan/distilbert-base-multilingual-cased-sentiments-student")
# Database session dependency
def get_db():
    db = database.SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.post("/analyze_sentiment")
def create_sentiment_result(sentiment_result: schemas.SentimentResultCreate,db: Session = Depends(get_db))->JSONResponse:
    try:
        # Perform input validation
        if not isinstance(sentiment_result.text_input, str) or not sentiment_result.text_input.strip():
            raise HTTPException(
                status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
                detail="Invalid text input"
            )

        text_content = sentiment_result.text_input
        sentiment_analysis_result = pipe(text_content)

        # Create a new SentimentResult instance
        new_sentiment_result = models.SentimentResult(
            score=sentiment_analysis_result[0]['score'],
            label=sentiment_analysis_result[0]['label'],
            text_input=text_content
        )

        # Add the new SentimentResult to the database
        db.add(new_sentiment_result)
        db.commit()
        db.refresh(new_sentiment_result)
        # Convert datetime objects to strings
        created_at_str = new_sentiment_result.created_at.strftime("%Y-%m-%dT%H:%M:%SZ")
        textinput_dict = {
             "id": new_sentiment_result.id,
             "text_input": new_sentiment_result.text_input,
             "score": new_sentiment_result.score,
             "label": new_sentiment_result.label,
             "created_at": created_at_str,
            }
     
        return JSONResponse(content=textinput_dict, status_code=status.HTTP_201_CREATED)
    
    except Exception as e:
        raise HTTPException(
            status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
            detail=f"An error occurred: {str(e)}"
        )

@app.delete("/sentiment/{id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_sentiment_result(id: int, db: Session = Depends(get_db)):
    # Retrieve the sentiment result and check for existence
    sentiment_result_to_delete = db.query(models.SentimentResult).filter(models.SentimentResult.id == id).first()

    if sentiment_result_to_delete is None:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"SentimentResult with ID {id} not found")

    # Delete the sentiment result
    db.delete(sentiment_result_to_delete)
    db.commit()