import peewee
import datetime


def migrate(migrator, database, **kwargs):
    db = database
    class Users(peewee.Model):
        user_id = peewee.AutoField()
        created = peewee.DateTimeField(default=datetime.datetime.now)
        last_login = peewee.DateTimeField(default=datetime.datetime.now)
        last_update = peewee.DateTimeField(default=datetime.datetime.now)
        last_ip = peewee.CharField(default="")
        username = peewee.CharField(default="", unique=True, index=True)
        password = peewee.CharField(default="")
        enabled = peewee.BooleanField(default=True)
        superuser = peewee.BooleanField(default=False)
        # we may need to revisit this
        api_token = peewee.CharField(default="", unique=True, index=True)

        class Meta:
            table_name = "users"
            database = db

    class Roles(peewee.Model):
        role_id = peewee.AutoField()
        created = peewee.DateTimeField(default=datetime.datetime.now)
        last_update = peewee.DateTimeField(default=datetime.datetime.now)
        role_name = peewee.CharField(default="", unique=True, index=True)

        class Meta:
            table_name = "roles"
            database = db

    class User_Roles(peewee.Model):
        user_id = peewee.ForeignKeyField(Users, backref='user_role')
        role_id = peewee.ForeignKeyField(Roles, backref='user_role')

        class Meta:
            table_name = 'user_roles'
            primary_key = peewee.CompositeKey('user_id', 'role_id')
            database = db

    class Audit_Log(peewee.Model):
        audit_id = peewee.AutoField()
        created = peewee.DateTimeField(default=datetime.datetime.now)
        user_name = peewee.CharField(default="")
        user_id = peewee.IntegerField(default=0, index=True)
        source_ip = peewee.CharField(default='127.0.0.1')
        # When auditing global events, use server ID 0
        server_id = peewee.IntegerField(default=None, index=True)
        log_msg = peewee.TextField(default='')

        class Meta:
            database = db

    class Host_Stats(peewee.Model):
        time = peewee.DateTimeField(default=datetime.datetime.now, index=True)
        boot_time = peewee.CharField(default="")
        cpu_usage = peewee.FloatField(default=0)
        cpu_cores = peewee.IntegerField(default=0)
        cpu_cur_freq = peewee.FloatField(default=0)
        cpu_max_freq = peewee.FloatField(default=0)
        mem_percent = peewee.FloatField(default=0)
        mem_usage = peewee.CharField(default="")
        mem_total = peewee.CharField(default="")
        disk_json = peewee.TextField(default="")

        class Meta:
            table_name = "host_stats"
            database = db

    class Servers(peewee.Model):
        server_id = peewee.AutoField()
        created = peewee.DateTimeField(default=datetime.datetime.now)
        server_uuid = peewee.CharField(default="", index=True)
        server_name = peewee.CharField(default="Server", index=True)
        path = peewee.CharField(default="")
        backup_path = peewee.CharField(default="")
        executable = peewee.CharField(default="")
        log_path = peewee.CharField(default="")
        execution_command = peewee.CharField(default="")
        auto_start = peewee.BooleanField(default=0)
        auto_start_delay = peewee.IntegerField(default=10)
        crash_detection = peewee.BooleanField(default=0)
        stop_command = peewee.CharField(default="stop")
        executable_update_url = peewee.CharField(default="")
        server_ip = peewee.CharField(default="127.0.0.1")
        server_port = peewee.IntegerField(default=25565)
        logs_delete_after = peewee.IntegerField(default=0)

        class Meta:
            table_name = "servers"
            database = db

    class User_Servers(peewee.Model):
        user_id = peewee.ForeignKeyField(Users, backref='user_server')
        server_id = peewee.ForeignKeyField(Servers, backref='user_server')

        class Meta:
            table_name = 'user_servers'
            primary_key = peewee.CompositeKey('user_id', 'server_id')
            database = db

    class Role_Servers(peewee.Model):
        role_id = peewee.ForeignKeyField(Roles, backref='role_server')
        server_id = peewee.ForeignKeyField(Servers, backref='role_server')

        class Meta:
            table_name = 'role_servers'
            primary_key = peewee.CompositeKey('role_id', 'server_id')
            database = db

    class Server_Stats(peewee.Model):
        stats_id = peewee.AutoField()
        created = peewee.DateTimeField(default=datetime.datetime.now)
        server_id = peewee.ForeignKeyField(Servers, backref='server', index=True)
        started = peewee.CharField(default="")
        running = peewee.BooleanField(default=False)
        cpu = peewee.FloatField(default=0)
        mem = peewee.FloatField(default=0)
        mem_percent = peewee.FloatField(default=0)
        world_name = peewee.CharField(default="")
        world_size = peewee.CharField(default="")
        server_port = peewee.IntegerField(default=25565)
        int_ping_results = peewee.CharField(default="")
        online = peewee.IntegerField(default=0)
        max = peewee.IntegerField(default=0)
        players = peewee.CharField(default="")
        desc = peewee.CharField(default="Unable to Connect")
        version = peewee.CharField(default="")
        updating = peewee.BooleanField(default=False)

        class Meta:
            table_name = "server_stats"
            database = db

    class Commands(peewee.Model):
        command_id = peewee.AutoField()
        created = peewee.DateTimeField(default=datetime.datetime.now)
        server_id = peewee.ForeignKeyField(Servers, backref='server', index=True)
        user = peewee.ForeignKeyField(Users, backref='user', index=True)
        source_ip = peewee.CharField(default='127.0.0.1')
        command = peewee.CharField(default='')
        executed = peewee.BooleanField(default=False)

        class Meta:
            table_name = "commands"
            database = db

    class Webhooks(peewee.Model):
        id = peewee.AutoField()
        name = peewee.CharField(max_length=64, unique=True, index=True)
        method = peewee.CharField(default="POST")
        url = peewee.CharField(unique=True)
        event = peewee.CharField(default="")
        send_data = peewee.BooleanField(default=True)

        class Meta:
            table_name = "webhooks"
            database = db

    class Schedules(peewee.Model):
        schedule_id = peewee.IntegerField(unique=True, primary_key=True)
        server_id = peewee.ForeignKeyField(Servers, backref='schedule_server')
        enabled = peewee.BooleanField()
        action = peewee.CharField()
        interval = peewee.IntegerField()
        interval_type = peewee.CharField()
        start_time = peewee.CharField(null=True)
        command = peewee.CharField(null=True)
        comment = peewee.CharField()

        class Meta:
            table_name = 'schedules'
            database = db

    class Backups(peewee.Model):
        directories = peewee.CharField(null=True)
        max_backups = peewee.IntegerField()
        server_id = peewee.ForeignKeyField(Servers, backref='backups_server')
        schedule_id = peewee.ForeignKeyField(Schedules, backref='backups_schedule')

        class Meta:
            table_name = 'backups'
            database = db

    migrator.create_table(Backups)
    migrator.create_table(Users)
    migrator.create_table(Roles)
    migrator.create_table(User_Roles)
    migrator.create_table(User_Servers)
    migrator.create_table(Host_Stats)
    migrator.create_table(Webhooks)
    migrator.create_table(Servers)
    migrator.create_table(Role_Servers)
    migrator.create_table(Server_Stats)
    migrator.create_table(Commands)
    migrator.create_table(Audit_Log)
    migrator.create_table(Schedules)


def rollback(migrator, database, **kwargs):
    migrator.drop_table('users')
    migrator.drop_table('roles')
    migrator.drop_table('user_roles')
    migrator.drop_table('audit_log') # ? Not 100% sure of the table name, please specify in the schema
    migrator.drop_table('host_stats')
    migrator.drop_table('servers')
    migrator.drop_table('user_servers')
    migrator.drop_table('role_servers')
    migrator.drop_table('server_stats')
    migrator.drop_table('commands')
    migrator.drop_table('webhooks')
    migrator.drop_table('schedules')
    migrator.drop_table('backups')