from pydantic import BaseModel,field_validator,Field
from fastapi import  Query
from typing import List, Optional, Any


# 定义fastapi请求参数模型

class signUp(BaseModel):
    email: str
    password: str
    # 可选参数
    expiredAt: int = Query(default=0, alias="expiredAt")
    balance: int = Query(default=0, alias="balance")
    ec: int = Query(default=200, alias="ec")


    @field_validator('email')
    #确保password不为''
    def check_email(cls, v):
        if v == '':
            raise ValueError('email cannot be an empty string')
        return v

    @field_validator('password')
    # 确保password不为''
    def check_password(cls, v):
        if v == '':
            raise ValueError('password cannot be an empty string')
        return v


class accountDelete(BaseModel):
    email: str
    password: str
    # 可选参数
    expiredAt: int = Query(default=0, alias="expiredAt")
    balance: int = Query(default=0, alias="balance")
    ec: int = Query(default=200, alias="ec")


    @field_validator('email')
    #确保password不为''
    def check_email(cls, v):
        if v == '':
            raise ValueError('email cannot be an empty string')
        return v

    @field_validator('password')
    # 确保password不为''
    def check_password(cls, v):
        if v == '':
            raise ValueError('password cannot be an empty string')
        return v



class signIn(BaseModel):
    email: str
    password: str
    # 可选参数
    expiredAt: int = Query(default=0, alias="expiredAt")
    balance: int = Query(default=0, alias="balance")
    ec: int = Query(default=200, alias="ec")


    @field_validator('email')
    # 确保password不为''
    def check_email(cls, v):
        if v == '':
            raise ValueError('email cannot be an empty string')
        return v

    @field_validator('password')
    # 确保password不为''
    def check_password(cls, v):
        if v == '':
            raise ValueError('password cannot be an empty string')
        return v


class SKUDetail(BaseModel):
    sku_id: Optional[str] = None
    price: Optional[str] = None
    count: Optional[int] = None
    name: Optional[str] = None
    album_id: Optional[str] = None
    pic: Optional[str] = None
    stock: Optional[str] = None
    post_id: Optional[str] = None


class AfdianOrderDetail(BaseModel):
    out_trade_no: Optional[str] = Field(default=None, alias="out_trade_no")
    user_id: Optional[str] = Field(default=None, alias="user_id")
    plan_id: Optional[str] = Field(default=None, alias="plan_id")
    title: Optional[str] = Field(default=None, alias="title") #just afdian test have
    month: Optional[int] = Field(default=None, alias="month")
    total_amount: Optional[int] = Field(default=None, alias="total_amount")  # 这里精髓在于pydantic会在能转换下自动转int 但字符串 "6.60" 将无法转换为整数,因此会导致 422 错误 因此商品可以回调而兑换码422
    show_amount: Optional[str] = Field(default=None, alias="show_amount")
    status: Optional[int] = Field(default=None, alias="status")
    remark: Optional[str] = Field(default=None, alias="remark")
    redeem_id: Optional[str] = Field(default=None, alias="redeem_id")
    product_type: Optional[int] = Field(default=None, alias="product_type")
    discount: Optional[str] = Field(default=None, alias="discount")
    sku_detail: Optional[List[SKUDetail]] = Field(default=[], alias="sku_detail") #兼容afdian test 请求
    create_time: Optional[int] = Field(default=None, alias="create_time")
    plan_title: Optional[str] = Field(default=None, alias="plan_title")
    user_private_id: Optional[str] = Field(default=None, alias="user_private_id")
    address_person: Optional[str] = Field(default=None, alias="address_person")
    address_phone: Optional[str] = Field(default=None, alias="address_phone")
    address_address: Optional[str] = Field(default=None, alias="address_address")
    custom_order_id: Optional[str] = Field(default=None, alias="custom_order_id")


class AfdianOrderData(BaseModel):
    type: str
    order: AfdianOrderDetail


class AfdianHookJson(BaseModel):
    ec: int
    em: str
    data: AfdianOrderData


class AfdianResp(BaseModel):
    ec: Any



#根据plan中的价格和时间相应减少balance和增加expiredAt
class userPlan(BaseModel):
    price: int
    duration_seconds: int
    email: str #订阅plan的用户
    password: str #请求purchase接口用户的password,保证只有用户本身可以请求这个接口防止滥用

    @field_validator('price')
    # 确保password不为''
    def check_price(cls, v):
        if v < 0:
            raise ValueError('price can not < 0')
        return v

    @field_validator('duration_seconds')
    # 确保password不为''
    def check_duration_seconds(cls, v):
        if v < 0:
            raise ValueError('duration_seconds can not < 0')
        return v

    @field_validator('email')
    # 确保password不为''
    def check_email(cls, v):
        if v == '':
            raise ValueError('email cannot be an empty string')
        return v