import time
import pymysql
import win32serviceutil
import win32service
import win32event

class SyncService(win32serviceutil.ServiceFramework):
    _svc_name_ = "SyncProdutosService"
    _svc_display_name_ = "Serviço de Sincronização de Produtos"

    def __init__(self, args):
        win32serviceutil.ServiceFramework.__init__(self, args)
        self.stop_event = win32event.CreateEvent(None, 0, 0, None)
        self.running = True

    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.stop_event)
        self.running = False

    def SvcDoRun(self):
        while self.running:
            try:
                self.sincronizar()
            except Exception as e:
                with open("C:\\sync_service.log", "a") as f:
                    f.write(f"Erro: {str(e)}\n")
            time.sleep(60)  # sincroniza a cada 60 segundos

    def sincronizar(self):
        # Conexão com banco remoto
        remoto = pymysql.connect(
            host="10.0.0.188",
            user="lidernetwork",
            password="564652670",
            database="banco"
        )

        # Conexão com banco local
        local = pymysql.connect(
            host="localhost",
            user="root",
            password="",
            database="delivery"
        )

        try:
            with remoto.cursor(pymysql.cursors.DictCursor) as rcur, local.cursor() as lcur:
                rcur.execute("SELECT COD_PRO, VALOR_PRO, NOME_PRO, CODIGO_BARRA_PRO FROM produto")
                produtos = rcur.fetchall()

                for p in produtos:
                    sql = """
                        INSERT INTO produtos (codigo, nome, preco, codigo_barra)
                        VALUES (%s, %s, %s, %s)
                        ON DUPLICATE KEY UPDATE
                            nome = VALUES(nome),
                            preco = VALUES(preco),
                            codigo_barra = VALUES(codigo_barra)
                    """
                    lcur.execute(sql, (p['COD_PRO'], p['NOME_PRO'], p['VALOR_PRO'], p['CODIGO_BARRA_PRO']))

                local.commit()
        finally:
            remoto.close()
            local.close()
