import mysql.connector
import os
import sys
import config
import calendar
import time
import datetime
import list

conn = mysql.connector.connect(host=config.host,
                               port=config.port,
                               user=config.user,
                               password=config.password,
                               database=config.database)

# Создайте объект cursor для выполнения SQL-запросов
cursor = conn.cursor()

cursor.execute("SHOW TABLES LIKE 'migration';")

# Получите результаты запроса
if len(cursor.fetchall()) >= 1:
    roleTableExistenceCheck = True
else:
    roleTableExistenceCheck = False

if not roleTableExistenceCheck:
    cursor.execute("""CREATE TABLE migration(
        ID INT PRIMARY KEY AUTO_INCREMENT,
        name VARCHAR(255) CHARACTER SET utf8mb4,
        datatime DATETIME );""")
    print("Создали таблицу migration")
else:
    print("migration уже существует")

# Закрыть соединение
conn.close()
#------------------------------------------

# Создаем пустой список
files = []

# Добавляем файлы в список
files += os.listdir(config.directory_sql)

def create():
    print("Команда 'create'")
    current_GMT = time.gmtime()
    time_stamp = calendar.timegm(current_GMT)
    filename = "sql/sql_{}.py".format(time_stamp)
    os.makedirs(os.path.dirname(filename), exist_ok=True)
    with open(filename, "w") as f:
        f.write("sql = [] \n")
        f.write("drop = [] \n")
    filename_short = "sql_{}".format(time_stamp)
    list_filename = "from sql import {} \n".format(filename_short)
    with open('list.py', "a") as f:
        f.write(list_filename)


def run():
    try:
        lastInjection = query("SELECT name FROM migration ORDER BY id DESC LIMIT 1;")
        print(lastInjection)
        for sm in sys.modules.keys():
            if "sql.sql_" in sm:
                smt = sm.replace("sql.", "")
                # print(smt, lastInjection[0][0])

                if len(lastInjection) < 1 or smt > lastInjection[0][0]:
                    try:
                        result = query(eval(f"list.{smt}.sql[0]"))
                        print(result)
                    except Exception as e:
                        print(f"Произошла ошибка в eval:  {e}")

                    if result != "err":
                        #Создайте объект datetime
                        now = datetime.datetime.now()
                        # Преобразуйте его в строку в формате DATETIME
                        formatted_datetime = now.strftime('%Y-%m-%d %H:%M:%S')

                        query(f"""INSERT into migration (name, datatime) VALUES ('{smt}', '{formatted_datetime}');""")
    except Exception as e:
        print(f"Произошла ошибка: {e}")



def downgrade(arg):
    print(f"Команда 'downgrade',c аргументом - '{arg}'")

    reversTable = query(f"SELECT id FROM migration where name = '{arg}';")

    for id in reversTable:
        result = query(eval(f"list.{arg}.drop[0]"))
        print(result)
        if result != "err":
            query(f"""delete from migration where id={id[0]};""")


def help():
    print("migration.py create - Для создании новой миграции")
    print("migration.py run - Для запуска миграций")
    print("migration.py downgrade - Для отката миграций")


def query(sql):
    try:
        conn = mysql.connector.connect(host=config.host,
                                       port=config.port,
                                       user=config.user,
                                       password=config.password,
                                       database=config.database)

        cursor = conn.cursor()

        cursor.execute(sql)
        result = cursor.fetchall()
        conn.commit()
        cursor.close()
        conn.close()

    except Exception as e:
        result = 'err'
        print(f"Произошла ошибка: {e}")

    return result

