"""
Other Collections router — card payments, credit, shortage, advance
entered from the Cash Handovers page and stored per (date, shift_type).
"""
from fastapi import APIRouter, Depends, Query
from sqlalchemy.orm import Session
from datetime import date
from typing import Optional
from pydantic import BaseModel

from ..database import get_db
from ..models import ShiftOtherCollections
from ..dependencies import get_current_user

router = APIRouter()


class OtherCollectionsIn(BaseModel):
    record_date:  date
    shift_type:   str
    card_visa:    float = 0
    card_amex:    float = 0
    card_touch:   float = 0
    credit_total: float = 0
    other_income: float = 0
    shortage:     float = 0
    advance:      float = 0


def _serialize(r: ShiftOtherCollections) -> dict:
    return {
        "id":           r.id,
        "record_date":  str(r.record_date),
        "shift_type":   r.shift_type,
        "card_visa":    float(r.card_visa),
        "card_amex":    float(r.card_amex),
        "card_touch":   float(r.card_touch),
        "credit_total": float(r.credit_total),
        "other_income": float(r.other_income),
        "shortage":     float(r.shortage),
        "advance":      float(r.advance),
    }


_DEFAULT = {
    "id": None, "card_visa": 0, "card_amex": 0, "card_touch": 0,
    "credit_total": 0, "other_income": 0, "shortage": 0, "advance": 0,
}


@router.get("/shift-other-collections")
def get_other_collections(
    record_date: date = Query(...),
    shift_type:  str  = Query(...),
    db: Session = Depends(get_db),
    _=Depends(get_current_user),
):
    rec = db.query(ShiftOtherCollections).filter_by(
        record_date=record_date, shift_type=shift_type
    ).first()
    if not rec:
        return {**_DEFAULT, "record_date": str(record_date), "shift_type": shift_type}
    return _serialize(rec)


@router.put("/shift-other-collections")
def upsert_other_collections(
    data: OtherCollectionsIn,
    db: Session = Depends(get_db),
    _=Depends(get_current_user),
):
    rec = db.query(ShiftOtherCollections).filter_by(
        record_date=data.record_date, shift_type=data.shift_type
    ).first()
    if rec:
        rec.card_visa    = data.card_visa
        rec.card_amex    = data.card_amex
        rec.card_touch   = data.card_touch
        rec.credit_total = data.credit_total
        rec.other_income = data.other_income
        rec.shortage     = data.shortage
        rec.advance      = data.advance
    else:
        rec = ShiftOtherCollections(
            record_date=data.record_date, shift_type=data.shift_type,
            card_visa=data.card_visa, card_amex=data.card_amex,
            card_touch=data.card_touch, credit_total=data.credit_total,
            other_income=data.other_income, shortage=data.shortage,
            advance=data.advance,
        )
        db.add(rec)
    db.commit()
    db.refresh(rec)
    return _serialize(rec)
