from datetime import datetime, timedelta
from secrets import randbits, token_hex
from typing import Optional

from fastapi import Query
from pydantic import BaseModel, EmailStr


class UserBase(BaseModel):
    email: EmailStr
    device_id: str
    lang_type: int = Query(None, ge=1, le=2)
    user_type: int = Query(None, ge=1, le=2)


class UserCreate(UserBase):
    full_name: str
    password: str
    gender: int = Query(None, ge=1, le=3)
    mobile: str = Query(None, min_length=8, max_length=13)
    user_image: Optional[str] = None
    device_type: int = Query(None, ge=1, le=2)
    city_id: int
    access_key: str = token_hex()
    otp: int = randbits(16)
    otp_valid_time: datetime = datetime.now() + timedelta(minutes=10)

    class Config:
        orm_mode = True


class UserCreateResponse(UserBase):
    id: int
    full_name: str
    password: str
    gender: int = Query(None, ge=1, le=3)
    mobile: str = Query(None, min_length=8, max_length=13)
    user_image: Optional[str] = None
    device_type: int = Query(None, ge=1, le=2)
    access_key: str
    otp: int
    otp_valid_time: datetime
    status: int = Query(None, ge=0, le=1)
    admin_status: int = Query(None, ge=0, le=1)
    created: datetime
    updated: datetime = Query(None)

    class Config:
        orm_mode = True


class UserLogin(UserBase):
    password: str

    class Config:
        orm_mode = True


class UserLoginResponse(UserBase):
    pass

    class Config:
        orm_mode = True


class SocialLogin(UserBase):
    type: int = Query(None, ge=1, le=2)
    social_id: str
    device_type: int = Query(None, ge=1, le=2)
    mobile: str = Query(None, min_length=8, max_length=13)
    full_name: str

    class Config:
        orm_mode = True


class OTPVerify(BaseModel):
    access_key: str
    otp: int

    class Config:
        orm_mode = True


class OTPVerifyResponse(BaseModel):
    pass

    class Config:
        orm_mode = True


    access_key: str
    otp: int = Query(None, ge=6, le=6)

    class Config:
        orm_mode = True