"""Zerodha hooks/callback routes for platform teGPT.

NOTE: Move-only split from `teGPT.py`.
"""

from fastapi import APIRouter, Depends, HTTPException, Body
from typing import Dict, Any
import logging
from datetime import datetime

from app.db import database
from app.v1.dependencies.auth import get_current_userdetails

router = APIRouter()
logger = logging.getLogger(__name__)


@router.post("/callback", summary="Zerodha OAuth callback")
async def oauth_callback(
    payload: Dict[str, Any] = Body(...),
    db=Depends(database.get_mongo_db),
    current_user=Depends(get_current_userdetails)
):
    """Handle Zerodha OAuth callback"""
    try:
        request_token = payload.get("request_token")
        user_id = str(current_user.get("_id"))

        if not request_token:
            raise HTTPException(status_code=400, detail="Missing request token")

        settings = db["zerodha_settings"].find_one({"user_id": user_id})
        if not settings:
            raise HTTPException(status_code=404, detail="Zerodha settings not found")

        from app.v1.services.zerodha.client import ZerodhaClient
        client = ZerodhaClient(settings["api_key"], settings["api_secret"])
        session = client.generate_session(request_token)

        # Update settings with access token
        db["zerodha_settings"].update_one(
            {"user_id": user_id},
            {"$set": {
                "access_token": session["access_token"],
                "login_time": datetime.utcnow(),
                "status": "active"
            }}
        )

        return {"status": "connected", "message": "Zerodha authentication successful"}
    except HTTPException:
        raise
    except Exception as e:
        logger.exception("OAuth callback failed")
        raise HTTPException(status_code=500, detail=str(e))


@router.post("/postback", summary="Zerodha postback handler")
async def zerodha_postback(
    payload: Dict[str, Any] = Body(...),
    db=Depends(database.get_mongo_db)
):
    """Handle Zerodha postback notifications"""
    try:
        # Store postback
        postback_doc = {
            "source": "zerodha",
            "payload": payload,
            "received_at": datetime.utcnow()
        }
        db["zerodha_postbacks"].insert_one(postback_doc)
        
        # Update order status if applicable
        order_id = payload.get("order_id")
        if order_id:
            db["orders"].update_one(
                {"zerodha_order_id": order_id},
                {"$set": {
                    "status": payload.get("status"),
                    "filled_quantity": payload.get("filled_quantity", 0),
                    "average_price": payload.get("average_price"),
                    "updated_at": datetime.utcnow()
                }}
            )
        
        return {"status": "received"}
    except Exception as e:
        logger.exception("Postback processing failed")
        raise HTTPException(status_code=500, detail=str(e))


# ============ WEBHOOKS ============


@router.post("/webhook/zerodha", summary="Zerodha order update webhook")
async def zerodha_webhook(
    payload: Dict[str, Any] = Body(...),
    db=Depends(database.get_mongo_db)
):
    """Handle Zerodha order update webhooks"""
    try:
        # Store webhook payload
        webhook_doc = {
            "source": "zerodha",
            "payload": payload,
            "received_at": datetime.utcnow()
        }
        db["webhooks"].insert_one(webhook_doc)
        
        # Update order status if applicable
        order_id = payload.get("order_id")
        if order_id:
            db["orders"].update_one(
                {"zerodha_order_id": order_id},
                {"$set": {
                    "status": payload.get("status"),
                    "filled_quantity": payload.get("filled_quantity", 0),
                    "average_price": payload.get("average_price"),
                    "updated_at": datetime.utcnow()
                }}
            )
        
        return {"status": "received"}
    except Exception as e:
        logger.exception("Webhook processing failed")
        raise HTTPException(status_code=500, detail=str(e))
