import pyodbc
import mysql.connector
import datetime
import schedule
import time
import sys

# Dados da conexção SQL Server
# SERVER='192.168.56.1,1433'
SERVER='OMEN25L'
DB='aa'
USER='sa'
PASSWORD='admin1'

def connect_sql_server():
    try:
        return pyodbc.connect(f'Driver={{SQL Server}};Server={SERVER};Database={DB};User={USER};Password={PASSWORD};Trusted_Connection=yes;')
    except Exception as e:
        print(f"Erro ao conectar ao SQL Server: {str(e)}")
        return None

def connect_mysql():
    try:
        return mysql.connector.connect(host='localhost', database='xpto', user='root', password='admin')
    except Exception as e:
        print(f"Erro ao conectar ao MySQL: {str(e)}")
        return None

def sync_familias(sql_server_cursor, mysql_cursor):
    # Sincronização da tabela Familias
    sql_server_cursor.execute('SELECT FamilyID, Description, Level, ParentDescription, FullPath, DtAlt, HrAlt FROM Family')
    families_sql_server = sql_server_cursor.fetchall()
    
    for family in families_sql_server:
        family = tuple(str(field) if isinstance(field, datetime.datetime) else field for field in family)
        mysql_cursor.execute('INSERT INTO Familias VALUES (%s, %s, %s, %s, %s, %s, %s)', family)

    print("Tabela Familias sincronizada com sucesso!")

def sync_clientes(sql_server_cursor, mysql_cursor):
    # Sincronização da tabela Clientes
    sql_server_cursor.execute('SELECT CustomerID, CreateDate, Telephone1, Telephone2, Telephone3, Telephone4, MobileTelephone1, MobileTelephone2, SalesmanID, DtAlt, HrAlt FROM Customer')
    customers_sql_server = sql_server_cursor.fetchall()

    for customer in customers_sql_server:
        customer = tuple(str(field) if isinstance(field, datetime.datetime) else field for field in customer)
        mysql_cursor.execute('INSERT INTO Clientes VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', customer)

    print("Tabela Clientes sincronizada com sucesso!")

def sync_artigos(sql_server_cursor, mysql_cursor):
    # Sincronização da tabela Artigos
    sql_server_cursor.execute('SELECT ItemID, AverageCostPrice, CurrencyID, AvailableUnits, AverageCostStockValue, CreateDate, OriginCountryID, DtAlt, HrAlt, FamilyID FROM Item')
    items_sql_server = sql_server_cursor.fetchall()

    for item in items_sql_server:
        item = tuple(str(field) if isinstance(field, datetime.datetime) else field for field in item)
        mysql_cursor.execute('INSERT INTO Artigos VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', item)

    print("Tabela Artigos sincronizada com sucesso!")

def sync_precos(sql_server_cursor, mysql_cursor):
    # Sincronização da tabela Artigos
    sql_server_cursor.execute('SELECT PriceLineID, ShortDescription, Description, DtAlt, HrAlt FROM PriceLine')
    precos_sql_server = sql_server_cursor.fetchall()

    for precos in precos_sql_server:
        precos = tuple(str(field) if isinstance(field, datetime.datetime) else field for field in precos)
        mysql_cursor.execute('INSERT INTO Precos VALUES (%s, %s, %s, %s, %s)', precos)

    print("Tabela Precos sincronizada com sucesso!")

def sync_unidades(sql_server_cursor, mysql_cursor):
    # Sincronização da tabela Artigos
    sql_server_cursor.execute('SELECT ItemID, UnitOfMeasure, UnitConversion, UnitType, UnitType, WorkstationID, SessionID, DtAlt, HrAlt FROM ItemUnits')
    unidades_sql_server = sql_server_cursor.fetchall()

    for unit in unidades_sql_server:
        unit = tuple(str(field) if isinstance(field, datetime.datetime) else field for field in unit)
        mysql_cursor.execute('INSERT INTO Unidade_Artigos VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)', unit)

    print("Tabela Unidades sincronizada com sucesso!")

def sync_precos_artigos(sql_server_cursor, mysql_cursor):
    # Sincronização da tabela Artigos
    sql_server_cursor.execute('SELECT ItemID, PriceUnitID, SizeID, LotID, CreateDate, PriceLineID, UnitPrice, TaxIncludedPrice, FixedProfitRate, CurrencyID, ColorID, DtAlt, HrAlt FROM ItemSellingPrices')
    precos_sql_server = sql_server_cursor.fetchall()

    for preco in precos_sql_server:
        preco = tuple(str(field) if isinstance(field, datetime.datetime) else field for field in preco)
        mysql_cursor.execute('INSERT INTO Preco_Artigos (ID_Item, Unidade, ID_Tamanho, ID_Lote, Data_Criacao, ID_Preco, PrecoUnidade, PrecoTaxaIncluida, TaxaLucroFixa, Moeda, ID_Cor, DtAlt, HrAlt) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', preco)

    print("Tabela Preco_Artigos sincronizada com sucesso!")

def sync_lotes(sql_server_cursor, mysql_cursor):
    # Sincronização da tabela Artigos
    sql_server_cursor.execute('SELECT ItemID, LotID, EditionID, EffectiveDate, ExpirationDate, ReturnWeek, ReturnYear, ItemLotDescription, SupplierItemID, BarCode, StoreId, WorkstationID, SessionID, UserAlt, DtAlt, HrAlt FROM ItemLot')
    lotes_sql_server = sql_server_cursor.fetchall()

    for lote in lotes_sql_server:
        lote = tuple(str(field) if isinstance(field, datetime.datetime) else field for field in lote)
        mysql_cursor.execute('INSERT INTO Lote_Artigos VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)', lote)

    print("Tabela Lote_Artigo sincronizada com sucesso!")

def sync_tamanhos(sql_server_cursor, mysql_cursor):
    # Sincronização da tabela Artigos
    sql_server_cursor.execute('SELECT ItemID, SizeID, SizeKey, SequenceNumber, WorkstationID, SessionID, UserAlt, DtAlt, HrAlt FROM ItemSize')
    tamanhos_sql_server = sql_server_cursor.fetchall()

    for tamanho in tamanhos_sql_server:
        tamanho = tuple(str(field) if isinstance(field, datetime.datetime) else field for field in tamanho)
        mysql_cursor.execute('INSERT INTO Tamanhos VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)', tamanho)

    print("Tabela Tamanhos sincronizada com sucesso!")

def sync_cores_artigos(sql_server_cursor, mysql_cursor):
    # Sincronização da tabela Artigos
    sql_server_cursor.execute('SELECT ItemID, ColorID, ColorKey, SequenceNumber, WorkstationID, UserAlt, DtAlt, HrAlt, SessionID FROM ItemColor')
    cores_sql_server = sql_server_cursor.fetchall()

    for cor in cores_sql_server:
        cor = tuple(str(field) if isinstance(field, datetime.datetime) else field for field in cor)
        mysql_cursor.execute('INSERT INTO Cor_Artigos VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)', cor)

    print("Tabela Cores sincronizada com sucesso!")

def limpar_tabelas(mysql_cursor):
    mysql_cursor.execute('TRUNCATE TABLE Clientes')
    mysql_cursor.execute('TRUNCATE TABLE Preco_Artigos')
    mysql_cursor.execute('TRUNCATE TABLE Precos')
    mysql_cursor.execute('TRUNCATE TABLE Familias')
    mysql_cursor.execute('TRUNCATE TABLE Tamanhos')
    mysql_cursor.execute('TRUNCATE TABLE Cor_Artigos')
    mysql_cursor.execute('TRUNCATE TABLE Unidade_Artigos')
    mysql_cursor.execute('TRUNCATE TABLE Artigos')
    # mysql_cursor.execute('TRUNCATE TABLE Lote_Artigos')

def sync_data():

    print("\nIsSync\n")

    sql_server_connection = connect_sql_server()
    mysql_connection = connect_mysql()

    if not sql_server_connection or not mysql_connection:
        return

    sql_server_cursor = sql_server_connection.cursor()
    mysql_cursor = mysql_connection.cursor()


    # Remover as chaves estrangeiras
    mysql_cursor.execute('ALTER TABLE Artigos DROP FOREIGN KEY fk_familia_id')
    mysql_cursor.execute('ALTER TABLE Preco_Artigos DROP FOREIGN KEY fk_cor_artigos')
    mysql_cursor.execute('ALTER TABLE Preco_Artigos DROP FOREIGN KEY fk_TAMANHO_id')
    mysql_cursor.execute('ALTER TABLE Preco_Artigos DROP FOREIGN KEY fk_Preco_id')
    mysql_cursor.execute('ALTER TABLE Preco_Artigos DROP FOREIGN KEY fk_LinhaPrecos_id')
    mysql_cursor.execute('ALTER TABLE Preco_Artigos DROP FOREIGN KEY fk_Unidade_id')
    # mysql_cursor.execute('ALTER TABLE Preco_Artigos DROP FOREIGN KEY fk_LOTE_id')
    # mysql_cursor.execute('ALTER TABLE Lote_Artigos DROP FOREIGN KEY fk_id_item')
    mysql_cursor.execute('ALTER TABLE Tamanhos DROP FOREIGN KEY fk_id_itemSize')
    mysql_cursor.execute('ALTER TABLE Cor_Artigos DROP FOREIGN KEY fk_id_item_U_cor')
    mysql_cursor.execute('ALTER TABLE Unidade_Artigos DROP FOREIGN KEY pk_Item_u_Unidade')

    limpar_tabelas(mysql_cursor)

    # Re-adicionar as chaves estrangeiras
    mysql_cursor.execute('ALTER TABLE Unidade_Artigos ADD CONSTRAINT pk_Item_u_Unidade FOREIGN KEY (ID_Item) REFERENCES Artigos(ID_Item)')
    mysql_cursor.execute('ALTER TABLE Cor_Artigos ADD CONSTRAINT fk_id_item_U_cor FOREIGN KEY (ID_Item) REFERENCES Artigos(ID_Item)')
    mysql_cursor.execute('ALTER TABLE Tamanhos ADD CONSTRAINT fk_id_itemSize FOREIGN KEY (ID_Item) REFERENCES Artigos(ID_Item)')
    # mysql_cursor.execute('ALTER TABLE Lote_Artigos ADD CONSTRAINT fk_id_item FOREIGN KEY (ID_Item) REFERENCES Artigos(ID_Item)')
    mysql_cursor.execute('ALTER TABLE Artigos ADD CONSTRAINT fk_familia_id FOREIGN KEY (Familia) REFERENCES Familias(ID_Familia)')
    mysql_cursor.execute('ALTER TABLE Preco_Artigos ADD CONSTRAINT fk_Unidade_id FOREIGN KEY (Unidade) REFERENCES Unidade_Artigos(Unidade)')
    mysql_cursor.execute('ALTER TABLE Preco_Artigos ADD CONSTRAINT fk_cor_artigos FOREIGN KEY (ID_Cor) REFERENCES Cor_Artigos(ID_Cor)')
    mysql_cursor.execute('ALTER TABLE Preco_Artigos ADD CONSTRAINT fk_LinhaPrecos_id FOREIGN KEY (ID_Preco) REFERENCES Precos(ID_Preco)')
    mysql_cursor.execute('ALTER TABLE Preco_Artigos ADD CONSTRAINT fk_Preco_id FOREIGN KEY (ID_Item) REFERENCES Artigos(ID_Item)')
    mysql_cursor.execute('ALTER TABLE Preco_Artigos ADD CONSTRAINT fk_TAMANHO_id FOREIGN KEY (ID_Tamanho) REFERENCES Tamanhos(ID_Tamanho)')
    # mysql_cursor.execute('ALTER TABLE Preco_Artigos ADD CONSTRAINT fk_LOTE_id FOREIGN KEY (ID_Lote) REFERENCES Lote_Artigos(ID_Lote)')
    print("Tabelas limpas com sucesso!")

    # Chamar funções de sincronização
    sync_familias(sql_server_cursor, mysql_cursor)
    sync_clientes(sql_server_cursor, mysql_cursor)
    sync_artigos(sql_server_cursor, mysql_cursor)
    sync_tamanhos(sql_server_cursor, mysql_cursor)
    # sync_lotes(sql_server_cursor, mysql_cursor)
    sync_cores_artigos(sql_server_cursor, mysql_cursor)
    sync_unidades(sql_server_cursor, mysql_cursor)
    sync_precos(sql_server_cursor, mysql_cursor)
    sync_precos_artigos(sql_server_cursor, mysql_cursor)

    mysql_connection.commit() # Commit para efetivar as alterações no MySQL
    # Fechar cursores e conexões
    sql_server_cursor.close()
    mysql_cursor.close()
    sql_server_connection.close()
    mysql_connection.close()

    print("Todas as tabelas foram sincronizadas com sucesso!")

def countdown_timer(seconds):
    for remaining in range(seconds, 0, -1):
        sys.stdout.write("\r")
        sys.stdout.write("Próxima sincronização em: {:2d}".format(remaining))
        sys.stdout.flush()
        time.sleep(1)  # Aguarda 1 segundo
    sys.stdout.write("\rA sincronizar...                         \n")

# Agendar a função para ser executada a cada 30 minutos
# schedule.every(15).seconds.do(sync_data)
# schedule.every(22).minutes.do(sync_data)


# Loop para continuar a executar a função
""" while True:
    # Calcular o tempo restante até a próxima execução
    next_run = schedule.next_run()
    time_until_next_run = next_run - datetime.datetime.now()
    seconds_until_next_run = int(time_until_next_run.total_seconds())

    # Exibir o temporizador de contagem regressiva com barra de progresso
    countdown_timer(seconds_until_next_run)

    # Verificar se é hora de executar a sincronização
    if seconds_until_next_run <= 0:
        sync_data()
        
    schedule.run_pending() """
sync_data()