class UserRegistration(db.Model):
    __tablename__ = 'user_registrations'
    # columns define
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20))
    password = db.Column(db.String(255))
    status = db.Column(db.Boolean, default=True)
    created_at = db.Column(TIMESTAMP(), nullable=False)
    updated_at = db.Column(
        TIMESTAMP(),
        nullable=False,
        server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'),
    )

    def __init__(self, username, password, created_at):
        self.username = username
        self.password = password
        self.created_at = created_at

    def __str__(self):
        return self.username

    def hashing(password):
        salt = app.config.get('SALT', '')
        db_password = password + salt
        hash = hashlib.md5(db_password.encode())
        hashing_password = hash.hexdigest()
        return hashing_password
class Customer(db.Model):
    __tablename__ = 'customers'

    def __str__(self):
        return self.name

    # define attributes of customer table
    id = db.Column(db.Integer, primary_key=True)
    ssn_id = db.Column(db.Integer)
    name = db.Column(db.String(255))
    age = db.Column(db.Integer)
    address = db.Column(db.String(255))
    state = db.Column(db.Integer)
    city = db.Column(db.Integer)
    created_at = db.Column(TIMESTAMP(), nullable=False)
    updated_at = db.Column(
        TIMESTAMP(),
        nullable=False,
        server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'),
    )

    def __init__(self, ssn_id, name, age, address, state, city, created_at):
        self.ssn_id = ssn_id
        self.name = name
        self.age = age
        self.address = address
        self.state = state
        self.city = city
        self.created_at = created_at
class Country(db.Model):
    __tablename__ = 'countries'

    def __str__(self):
        return self.name

    # Columns
    id = db.Column(db.Integer, primary_key=True)
    sortname = db.Column(db.String(3))
    name = db.Column(db.String(150))
    phonecode = db.Column(db.Integer)
class City(db.Model):
    __tablename__ = 'cities'

    def __str__(self):
        return self.name

    # Columns
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(30))
    state_id = db.Column(db.Integer, db.ForeignKey('states.id'))
class TransactionControl(db.Model):
    __tablename__ = 'transactions_control'

    def __str__(self):
        return "<Transaction Id: " + str(self.id) + ">"

    id = db.Column(db.Integer, primary_key=True)
    transaction_id = db.Column(db.String(100))
    account_id = db.Column(db.Integer)
    description = db.Column(db.String(100))
    amount = db.Column(db.Integer)
    created_at = db.Column(TIMESTAMP(), nullable=False)

    def __init__(self, account_id, description, amount, created_at):
        self.account_id = account_id
        self.transaction_id = self.get_transaction_id()
        self.description = description
        self.amount = amount
        self.created_at = created_at

    def get_transaction_id(self):
        transaction_id = datetime.now().strftime('%Y%m-%d%H-%M%S-') + str(
            uuid4())
        return transaction_id
class CustomerStatus(db.Model):
    __tablename__ = 'customer_status'

    def __str__(self):
        return "<Customer Id: " + self.name + ">"

    id = db.Column(db.Integer, primary_key=True)
    customer_id = db.Column(db.Integer, db.ForeignKey('customers.id'))
    ssn_id = db.Column(db.Integer)
    status = db.Column(db.Boolean, default=True)
    message = db.Column(db.String(255))
    updated_at = db.Column(
        TIMESTAMP(),
        nullable=False,
        server_default=text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'),
    )

    def __init__(self, customer_id, ssn_id, message):
        self.customer_id = customer_id
        self.ssn_id = ssn_id
        self.message = message