from datetime import datetime
from typing import List, Any

from pydantic import BaseModel, model_validator, ConfigDict
from typing_extensions import Optional

from core.config import get_db
from models import Participant
from schema import GenericResponse


class CartCreateSchema(BaseModel):
    course_id: int
    participant_id: List[int]


class CartBaseSchema(BaseModel):
    id:Optional[int]
    course_details: Optional[dict]
    cart_line_item_id: Optional[str]
    parent_id: Optional[int]
    cart_owner: int
    participant_id: Optional[int]
    course_id: int
    course_original_amount: float = 0
    discount_amount: float = 0
    final_amount: float = 0
    is_discount_applied: bool = False
    transaction_batch_id: Optional[str]
    is_cart_processed: bool = False
    model_config = ConfigDict(from_attributes=True)

class CheckoutSchema(BaseModel):
    use_wallet: bool = False
    # payment_method: str = "wallet"
    charity: Optional[bool] = False
    discount_coupon_code: Optional[str] = None


class PaymentBase(BaseModel):
    created_by: int
    purchased_for_id:Optional[int]=None
    participant_id: Optional[int] = None
    course_id: int
    course_details:Any
    is_wallet_used: bool = False
    used_wallet_amount: float = 0
    url: Optional[str] = None
    original_amount: float
    paid_amount: float
    payment_status: str
    payment_method: str
    intent_created_on: Optional[datetime] = None
    paid_on: Optional[datetime] = None
    payment_id: Optional[str] = None
    is_payment_completed: bool = False
    transaction_batch_id: Optional[str] = None
    webhook_id: Optional[str] = None
    webhook_secret: Optional[str] = None

    refund_amount: float = 0
    refund_status: Optional[str] = None
    refund_created_on: Optional[datetime] = None
    refund_completed_on: Optional[datetime] = None
    refund_note: Optional[str] = None
    is_refund_completed: bool = False
    is_refund_requested: bool = False

    model_config = ConfigDict(from_attributes=True)



class PaymentDetailsBase(BaseModel):
    id: int
    payment_id: int
    purchased_for_id: Optional[int]
    course_id: int

    course_original_amount: float
    final_amount: float

    refund_amount: float = 0
    refund_status: Optional[str]
    refund_created_on: Optional[datetime]
    refund_completed_on: Optional[datetime]
    refund_note: Optional[str]
    is_refund_completed: bool = False
    is_refund_requested: bool = False
    model_config = ConfigDict(from_attributes=True)

