from fastapi import APIRouter, Depends, HTTPException, Response, Query
from sqlalchemy.orm import Session
from datetime import datetime
from app.db.session import get_db
from app.db.models import Delivery
import base64

router = APIRouter(prefix="/track", tags=["tracking"])


# 1x1 transparent pixel for email open tracking
TRACKING_PIXEL = base64.b64decode(
    "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
)


@router.get("/open/{delivery_id}")
async def track_open(
    delivery_id: int,
    db: Session = Depends(get_db)
):
    """
    Track email/notification open via pixel
    Returns 1x1 transparent GIF
    """
    delivery = db.query(Delivery).filter(Delivery.id == delivery_id).first()
    
    if delivery and not delivery.opened_at:
        delivery.opened_at = datetime.utcnow()
        db.commit()
    
    # Return 1x1 transparent GIF
    return Response(
        content=TRACKING_PIXEL,
        media_type="image/gif",
        headers={
            "Cache-Control": "no-cache, no-store, must-revalidate",
            "Pragma": "no-cache",
            "Expires": "0"
        }
    )


@router.get("/click/{delivery_id}")
async def track_click(
    delivery_id: int,
    url: str = Query(..., description="Redirect URL"),
    db: Session = Depends(get_db)
):
    """
    Track link click and redirect to target URL
    """
    delivery = db.query(Delivery).filter(Delivery.id == delivery_id).first()
    
    if delivery:
        # Update clicked_at if not already set
        if not delivery.clicked_at:
            delivery.clicked_at = datetime.utcnow()
            
        # Also mark as opened if not already
        if not delivery.opened_at:
            delivery.opened_at = datetime.utcnow()
        
        # Store click metadata
        if not delivery.response_meta:
            delivery.response_meta = {}
        
        if 'clicks' not in delivery.response_meta:
            delivery.response_meta['clicks'] = []
        
        delivery.response_meta['clicks'].append({
            'url': url,
            'timestamp': datetime.utcnow().isoformat()
        })
        
        db.commit()
    
    # Redirect to target URL
    return Response(
        status_code=302,
        headers={"Location": url}
    )


@router.post("/webhook/open")
async def webhook_track_open(
    delivery_id: int,
    db: Session = Depends(get_db)
):
    """
    Webhook endpoint for tracking opens (e.g., from Telegram, VK)
    """
    delivery = db.query(Delivery).filter(Delivery.id == delivery_id).first()
    
    if not delivery:
        raise HTTPException(status_code=404, detail="Delivery not found")
    
    if not delivery.opened_at:
        delivery.opened_at = datetime.utcnow()
        db.commit()
    
    return {"status": "success", "delivery_id": delivery_id}


@router.post("/webhook/click")
async def webhook_track_click(
    delivery_id: int,
    url: str | None = None,
    db: Session = Depends(get_db)
):
    """
    Webhook endpoint for tracking clicks (e.g., from Telegram, VK)
    """
    delivery = db.query(Delivery).filter(Delivery.id == delivery_id).first()
    
    if not delivery:
        raise HTTPException(status_code=404, detail="Delivery not found")
    
    # Update clicked_at if not already set
    if not delivery.clicked_at:
        delivery.clicked_at = datetime.utcnow()
    
    # Also mark as opened if not already
    if not delivery.opened_at:
        delivery.opened_at = datetime.utcnow()
    
    # Store click metadata
    if url:
        if not delivery.response_meta:
            delivery.response_meta = {}
        
        if 'clicks' not in delivery.response_meta:
            delivery.response_meta['clicks'] = []
        
        delivery.response_meta['clicks'].append({
            'url': url,
            'timestamp': datetime.utcnow().isoformat()
        })
    
    db.commit()
    
    return {"status": "success", "delivery_id": delivery_id}

