from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from src.infrastructure.database.connection import get_db
from src.infrastructure.models.application_model import ApplicationModel
from pydantic import BaseModel
from typing import List, Optional
from datetime import datetime
import decimal

router = APIRouter()

class ApplicationResponse(BaseModel):
    id: int
    name: Optional[str] = None
    approved_amount: Optional[decimal.Decimal] = None
    state: Optional[str] = None
    dob: Optional[str] = None
    pan_number: Optional[str] = None
    aadhar_number: Optional[str] = None
    gender: Optional[str] = None
    marital_status: Optional[str] = None
    education: Optional[str] = None
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None

    class Config:
        from_attributes = True

class ApplicationUpdateRequest(BaseModel):
    name: Optional[str] = None
    state: Optional[str] = None
    approved_amount: Optional[decimal.Decimal] = None
    dob: Optional[str] = None
    pan_number: Optional[str] = None
    aadhar_number: Optional[str] = None
    gender: Optional[str] = None
    marital_status: Optional[str] = None
    education: Optional[str] = None

@router.get("/", response_model=List[ApplicationResponse], tags=["applications"])
def get_recent_applications(db: Session = Depends(get_db)):
    """Fetch recent applications for Dashboard."""
    applications = db.query(ApplicationModel).order_by(ApplicationModel.updated_at.desc()).limit(10).all()
    return applications

@router.get("/{application_id}", response_model=ApplicationResponse, tags=["applications"])
def get_application_by_id(application_id: int, db: Session = Depends(get_db)):
    """Fetch a single application by ID for viewing/editing."""
    application = db.query(ApplicationModel).filter(ApplicationModel.id == application_id).first()
    if not application:
        raise HTTPException(status_code=404, detail="Application not found")
    return application

@router.put("/{application_id}", response_model=ApplicationResponse, tags=["applications"])
def update_application(application_id: int, payload: ApplicationUpdateRequest, db: Session = Depends(get_db)):
    """Update application details."""
    application = db.query(ApplicationModel).filter(ApplicationModel.id == application_id).first()
    if not application:
        raise HTTPException(status_code=404, detail="Application not found")
    
    update_data = payload.dict(exclude_unset=True)
    for key, value in update_data.items():
        setattr(application, key, value)
        
    db.commit()
    db.refresh(application)
    return application
