from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from typing import List, Optional
from datetime import date

from ..database import get_db
from ..models import TankDipReading
from ..schemas import TankDipReadingCreate, TankDipReadingOut
from .auth import get_current_user

router = APIRouter()


@router.get("", response_model=List[TankDipReadingOut])
def get_tank_readings(
    date: Optional[str] = Query(None),
    db: Session = Depends(get_db),
    _user=Depends(get_current_user),
):
    q = db.query(TankDipReading)
    if date:
        q = q.filter(TankDipReading.read_date == date)
    return q.order_by(TankDipReading.tank_name).all()


@router.put("", response_model=TankDipReadingOut)
def upsert_tank_reading(
    body: TankDipReadingCreate,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    row = (
        db.query(TankDipReading)
        .filter_by(read_date=body.read_date, tank_name=body.tank_name)
        .first()
    )
    action = 'UPDATE' if row else 'CREATE'
    if row:
        row.height_cm   = body.height_cm
        row.volume_ltr  = body.volume_ltr
        row.recorded_by = user.id
    else:
        row = TankDipReading(**body.model_dump(), recorded_by=user.id)
        db.add(row)
        db.flush()
    from .audit import log_audit
    log_audit(db, user.id, action, 'tank_dip_readings', row.id,
              f"{action} dip: {body.tank_name} {body.height_cm}cm / {body.volume_ltr}L on {body.read_date}")
    db.commit()
    db.refresh(row)
    return row
