import json
import pprint
from typing import Optional

from pydantic import BaseModel
from stripe import Webhook

from fastapi import APIRouter, Depends,Request,Query
from fastapi.background import BackgroundTasks
from core.security.authentication import get_user
from schema import GenericResponse
from schema.payment import CartCreateSchema,  CheckoutSchema
from services.payment import PaymentService
from core.utility import send_email, send_order_summary_email,send_email_smtp

payment_router = APIRouter(prefix="/payment")
cart_router = APIRouter(prefix="/cart")


@cart_router.post("/add", response_model=GenericResponse)
async def add_to_cart(request: CartCreateSchema, user=Depends(get_user), service: PaymentService = Depends(PaymentService)):
    service.add_to_cart(request, user)
    return {"message": "Course added to the cart"}

@cart_router.get("/list", )
async def list_cart_item(user=Depends(get_user), service: PaymentService = Depends(PaymentService)):
    return {"message": "Cart item populated successfully", "data": service.list_cart_items(user)}

@cart_router.delete("/{cart_line_item_id}", )
async def delete_cart_item(cart_line_item_id:str,user=Depends(get_user), service: PaymentService = Depends(PaymentService)):
    return {"message": "Cart item deleted successfully", "data": service.remove_cart_item(cart_line_item_id,user)}

@cart_router.post("/checkout")
async def create_checkout_session(request:CheckoutSchema,user=Depends(get_user), service: PaymentService = Depends(PaymentService)):
    return {"message": "Checkout session created successfully","data":service.create_checkout_session(request,user)}

@payment_router.post("/stripe/webhook")
async def update_payment(request:Request,background_tasks: BackgroundTasks,service: PaymentService = Depends(PaymentService)):
    payload = await request.body()
    sig_header = request.headers.get("Stripe-Signature")
    service.update_payment(payload,sig_header,background_tasks)
    return {"message": "Payment status updated successfully"}

@payment_router.post("/verify/{transaction_batch_id}")
async def verify_transaction(transaction_batch_id:str,service: PaymentService = Depends(PaymentService)):
    return service.verify_payment(transaction_batch_id)


class HistoryFilter(BaseModel):
    email:Optional[str]=None
    mobile_number:Optional[str]=None
    status:Optional[str]=None

@payment_router.post("/history")
async def payment_history(request:HistoryFilter,user=Depends(get_user), service: PaymentService = Depends(PaymentService)):
    return {"message": "Payment history","data":service.payment_history(user,request)}

@payment_router.post("/history/{transaction_id}")
async def payment_history_details(transaction_id:str,user=Depends(get_user), service: PaymentService = Depends(PaymentService)):
    return {"message": "Payment history","data":service.payment_history_details(transaction_id)}


@payment_router.post("/send_email")
async def api_send_email(user=Depends(get_user)):
    send_email("Tins P Joseph","tinspj1997@gmail.com","Order Confirmation")
    return {"message": "Email sent successfully"}

class PurchasedCourseFilter(BaseModel):
    participant_name: Optional[str] = None
    academic_year_id: Optional[int] = None
    term_id: Optional[int] = None
    
@payment_router.post("/purchased-courses")
async def get_purchased_courses(request: PurchasedCourseFilter, user=Depends(get_user), service: PaymentService = Depends(PaymentService)):
    """Get all courses purchased by the current user"""
    return {
        "message": "Purchased courses retrieved successfully",
        "data": service.get_purchased_courses(user,request),
    }

@payment_router.get("/details/{payment_details_id}")
async def get_payment_details(payment_details_id: int, user=Depends(get_user), service: PaymentService = Depends(PaymentService)):
    return {
        "message": "Payment details retrieved successfully",
        "data": service.get_payment_details(payment_details_id)
    }

# Add this endpoint to your router
@payment_router.post("/send-order-summary-email")
async def send_order_summary_email_endpoint(
    payment_id: str = Query(..., description="Payment ID to send summary for"),
    payment_service: PaymentService = Depends()
):
    """
    Send order summary email for a specific payment
    """
    return send_order_summary_email(payment_id)
    # Example usage
    # result = send_email_smtp(
    #     to_name="John Doe",
    #     to_email="tinspj1997@gmail.com",
    #     subject="Order Confirmation",
    #     html_content="<h1>Thank you for your order!</h1><p>Your order has been confirmed.</p>"
    # )

    # print(result)
    # return result


