from pydantic import BaseModel
from typing import Optional

class UniAccountBase(BaseModel):
    groupid: int
    name: str
    description: str
    default_acid: int
    rank: Optional[int]
    title_initial: str
    createtime: int
    logo: str
    qrcode: str
    create_uid: int

class UniAccountCreate(UniAccountBase):
    pass

class UniAccountUpdate(BaseModel):
    groupid: Optional[int]
    name: Optional[str]
    description: Optional[str]
    default_acid: Optional[int]
    rank: Optional[int]
    title_initial: Optional[str]
    logo: Optional[str]
    qrcode: Optional[str]
    create_uid: Optional[int]

class UniAccountRead(UniAccountBase):
    uniacid: int

    class Config:
        from_attributes = True

class UniAccountExtraModulesBase(BaseModel):
    uniacid: int
    modules: str

class UniAccountExtraModulesCreate(UniAccountExtraModulesBase):
    pass

class UniAccountExtraModulesUpdate(BaseModel):
    modules: Optional[str]

class UniAccountExtraModulesRead(UniAccountExtraModulesBase):
    id: int

    class Config:
        from_attributes = True

class UniAccountGroupBase(BaseModel):
    uniacid: int
    groupid: int

class UniAccountGroupCreate(UniAccountGroupBase):
    pass

class UniAccountGroupUpdate(BaseModel):
    groupid: Optional[int]

class UniAccountGroupRead(UniAccountGroupBase):
    id: int

    class Config:
        from_attributes = True

class UniAccountMenusBase(BaseModel):
    uniacid: int
    menuid: int
    type: int
    title: str
    sex: int
    group_id: int
    client_platform_type: int
    area: str
    data: str
    status: int
    createtime: int
    isdeleted: int

class UniAccountMenusCreate(UniAccountMenusBase):
    pass

class UniAccountMenusUpdate(BaseModel):
    type: Optional[int]
    title: Optional[str]
    sex: Optional[int]
    group_id: Optional[int]
    client_platform_type: Optional[int]
    area: Optional[str]
    data: Optional[str]
    status: Optional[int]
    isdeleted: Optional[int]

class UniAccountMenusRead(UniAccountMenusBase):
    id: int

    class Config:
        from_attributes = True

class UniAccountModulesBase(BaseModel):
    uniacid: int
    module: str
    enabled: int
    settings: str
    shortcut: int
    displayorder: int

class UniAccountModulesCreate(UniAccountModulesBase):
    pass

class UniAccountModulesUpdate(BaseModel):
    module: Optional[str]
    enabled: Optional[int]
    settings: Optional[str]
    shortcut: Optional[int]
    displayorder: Optional[int]

class UniAccountModulesRead(UniAccountModulesBase):
    id: int

    class Config:
        from_attributes = True

class UniAccountModulesShortcutBase(BaseModel):
    title: str
    url: str
    icon: str
    uniacid: int
    version_id: int
    module_name: str

class UniAccountModulesShortcutCreate(UniAccountModulesShortcutBase):
    pass

class UniAccountModulesShortcutUpdate(BaseModel):
    title: Optional[str]
    url: Optional[str]
    icon: Optional[str]
    version_id: Optional[int]
    module_name: Optional[str]

class UniAccountModulesShortcutRead(UniAccountModulesShortcutBase):
    id: int

    class Config:
        from_attributes = True

class UniAccountUsersBase(BaseModel):
    uniacid: int
    uid: int
    role: str
    rank: int

class UniAccountUsersCreate(UniAccountUsersBase):
    pass

class UniAccountUsersUpdate(BaseModel):
    role: Optional[str]
    rank: Optional[int]

class UniAccountUsersRead(UniAccountUsersBase):
    id: int

    class Config:
        from_attributes = True

class UniGroupBase(BaseModel):
    owner_uid: int
    name: str
    modules: str
    templates: str
    uniacid: int
    uid: int

class UniGroupCreate(UniGroupBase):
    pass

class UniGroupUpdate(BaseModel):
    name: Optional[str]
    modules: Optional[str]
    templates: Optional[str]
    owner_uid: Optional[int]
    uid: Optional[int]

class UniGroupRead(UniGroupBase):
    id: int

    class Config:
        from_attributes = True

class UniLinkUniacidBase(BaseModel):
    uniacid: int
    link_uniacid: int
    version_id: int
    module_name: str

class UniLinkUniacidCreate(UniLinkUniacidBase):
    pass

class UniLinkUniacidUpdate(BaseModel):
    link_uniacid: Optional[int]
    version_id: Optional[int]
    module_name: Optional[str]

class UniLinkUniacidRead(UniLinkUniacidBase):
    id: int

    class Config:
        from_attributes = True

class UniModulesBase(BaseModel):
    uniacid: int
    module_name: str

class UniModulesCreate(UniModulesBase):
    pass

class UniModulesUpdate(BaseModel):
    module_name: Optional[str]

class UniModulesRead(UniModulesBase):
    id: int

    class Config:
        from_attributes = True

class UniVerifycodeBase(BaseModel):
    uniacid: int
    receiver: str
    verifycode: str
    total: int
    createtime: int
    failed_count: Optional[int]

class UniVerifycodeCreate(UniVerifycodeBase):
    pass

class UniVerifycodeUpdate(BaseModel):
    verifycode: Optional[str]
    total: Optional[int]
    failed_count: Optional[int]

class UniVerifycodeRead(UniVerifycodeBase):
    id: int

    class Config:
        from_attributes = True

class UniSettingsBase(BaseModel):
    uniacid: int
    passport: str
    oauth: str
    jsauth_acid: int
    notify: str
    creditnames: str
    creditbehaviors: str
    welcome: str
    default: str
    default_message: str
    payment: str
    stat: str
    default_site: Optional[int]
    sync: int
    recharge: str
    tplnotice: str
    grouplevel: int
    mcplugin: str
    exchange_enable: int
    coupon_type: int
    menuset: str
    statistics: str
    bind_domain: str
    comment_status: int
    reply_setting: int
    default_module: str
    attachment_limit: int
    attachment_size: str
    sync_member: int
    remote: str

class UniSettingsCreate(UniSettingsBase):
    pass

class UniSettingsUpdate(BaseModel):
    passport: Optional[str]
    oauth: Optional[str]
    jsauth_acid: Optional[int]
    notify: Optional[str]
    creditnames: Optional[str]
    creditbehaviors: Optional[str]
    welcome: Optional[str]
    default: Optional[str]
    default_message: Optional[str]
    payment: Optional[str]
    stat: Optional[str]
    default_site: Optional[int]
    sync: Optional[int]
    recharge: Optional[str]
    tplnotice: Optional[str]
    grouplevel: Optional[int]
    mcplugin: Optional[str]
    exchange_enable: Optional[int]
    coupon_type: Optional[int]
    menuset: Optional[str]
    statistics: Optional[str]
    bind_domain: Optional[str]
    comment_status: Optional[int]
    reply_setting: Optional[int]
    default_module: Optional[str]
    attachment_limit: Optional[int]
    attachment_size: Optional[str]
    sync_member: Optional[int]
    remote: Optional[str]

class UniSettingsRead(UniSettingsBase):
    class Config:
        from_attributes = True