from models.configs.dbconfig import db, ma, hash_password, verify_password
from sqlalchemy import exc, and_

class Auth(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    uid = db.Column(db.String(100), unique = True)
    password = db.Column(db.String(200))
    isVerified = db.Column(db.Integer)
    email = db.Column(db.String(100))
    userInfo = db.relationship('User', backref="auth", uselist=False)

    def __init__(self, uid, password, email, isVerified):
        self.uid = uid
        self.password = password
        self.email = email
        self.isVerified = isVerified

class User(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    auth_id = db.Column(db.String(100), db.ForeignKey('auth.uid'), unique = True)
    username = db.Column(db.String(50))
    fullname = db.Column(db.Text())
    bio = db.Column(db.Text())
    email = db.Column(db.String(100))
    phone = db.Column(db.String(20))
    sex = db.Column(db.String(7))
    access = db.Column(db.String(7))
    auth_type = db.Column(db.String(7))
    country = db.Column(db.String(20))
    image = db.Column(db.String(500))
    date_added = db.Column(db.String(50))

    def __init__(self, username, fullname, bio, email, sex, access, phone, country, auth_id, image, date_added, auth_type):
        self.username = username
        self.fullname = fullname
        self.email = email
        self.sex = sex
        self.access = access
        self.phone = phone
        self.country = country
        self.bio = bio
        self.auth_id = auth_id
        self.date_added = date_added
        self.auth_type = auth_type

class ChoiceModel(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    auth_id = db.Column(db.BigInteger, db.ForeignKey('auth.uid'))
    info = db.Column(db.Text())
    type = db.Column(db.String(20))

    def __init__(self, auth_id, info, type):
        self.auth_id = auth_id
        self.type = type
        self.info = info

class UserFcmModel(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    uid = db.Column(db.BigInteger, db.ForeignKey('auth.uid'), unique = True)
    tokens = db.Column(db.Text())
    canPush = db.Column(db.Boolean())

    def __init__(self, uid, tokens, canPush):
        self.uid = uid
        self.tokens = tokens
        self.isVerified = canPush

class AuthSchema(ma.Schema):
    class Meta:
        fields = ('uid', 'email', 'isVerified')

class UserSchema(ma.Schema):
    class Meta:
        fields = ('username', 'fullname', 'bio', 'email', 'sex', 'access', 'phone', 'auth_id', 'image', 'date_added', 'auth_type', 'user') 

class ChoiceModelSchema(ma.Schema):
    class Meta:
        fields = ('auth_id', 'info', 'type')

class UserFcmModelSchema(ma.Schema):
    class Meta:
        fields = ('uid', 'tokens', 'canPush')

auth_scheme = AuthSchema()
auths_scheme = AuthSchema(many = True)

user_scheme = UserSchema()
users_scheme = UserSchema(many = True)

choice_model_scheme = ChoiceModelSchema()
choices_model_scheme = ChoiceModelSchema(many = True)

user_fcm_scheme = UserFcmModelSchema()
users_fcm_scheme = UserFcmModelSchema(many = True)

db.create_all()