from subprocess import run
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from datetime import datetime
from constants import DB_NAME, DB_USER, DB_PW


def create_database():
    script = "database/mariadb_setup.sh"
    output = run([script, DB_NAME, DB_USER, DB_PW])
    if output.returncode != 0:
        print("Error: couldn't create database")
        exit()


def create_connection():
    host = "localhost:3306"
    connection_uri = "mysql+pymysql://{user}:{pw}@{url}/{db}".format(
        user=DB_USER, pw=DB_PW, url=host, db=DB_NAME
    )
    app = Flask(__name__)
    app.config["SQLALCHEMY_DATABASE_URI"] = connection_uri
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    db = SQLAlchemy(app)
    return db


db = create_connection()


class Glacier(db.Model):
    uid = db.Column(db.Integer, primary_key=True)
    country = db.Column(db.String(60))
    name = db.Column(db.String(60))

    def __init__(self, uid, country, name):
        self.uid = uid
        self.country = country
        self.name = name


class Annual_Data(db.Model):
    glacier = db.relationship("Glacier", backref=db.backref("posts", lazy=True))
    uid = db.Column(
        db.Integer, db.ForeignKey("glacier.uid"), nullable=False, primary_key=True
    )
    surface = db.Column(db.Integer)
    volume = db.Column(db.Integer)
    thickness = db.Column(db.Integer)
    year = db.Column(db.Integer, primary_key=True)

    def __init__(self, surface, volume, thickness, year):
        self.surface = surface
        self.volume = volume
        self.thickness = thickness
        self.year = year


class Annual_Change(db.Model):
    glacier = db.relationship("Glacier", backref=db.backref("posts", lazy=True))
    uid = db.Column(
        db.Integer, db.ForeignKey("glacier.uid"), nullable=False, primary_key=True
    )
    surface_change = db.Column(db.Integer)
    volume_change = db.Column(db.Integer)
    thickness_change = db.Column(db.Integer)
    year = db.Column(db.Integer, primary_key=True)

    def __init__(self, surface_change, volume_change, thickness_change, year):
        self.surface_change = surface_change
        self.volume_change = volume_change
        self.thickness_change = thickness_change
        self.year = year


class User(db.Model):
    uid = db.Column(db.Integer, primary_key=True)
    registration_date = db.Column(db.DateTime, nullable=False)
    username = db.Column(db.String(20), nullable=False, unique=True)
    password = db.Column(db.String(60))

    def __init__(self, uid, username, password):
        self.uid = uid
        self.registration_date = datetime.today()
        self.username = username
        self.password = password


def create_tables():
    db.create_all()


def main():
    create_database()
    create_tables()


if __name__ == "__main__":
    main()
