import time
import pymysql
import win32serviceutil
import win32service
import win32event
import traceback

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):
        self.log("Serviço iniciado. Sincronizando a cada 60 segundos...")
        while self.running:
            try:
                self.sincronizar()
                self.log("✅ Sincronização concluída com sucesso.")
            except Exception as e:
                erro = traceback.format_exc()
                self.log(f"❌ Erro durante sincronização:\n{erro}")
            time.sleep(60)  # aguarda 60 segundos entre execuções

    def log(self, msg):
        with open("C:\\sync_service.log", "a", encoding="utf-8") as f:
            f.write(f"[{time.strftime('%d/%m/%Y %H:%M:%S')}] {msg}\n")

    def sincronizar(self):
        remoto = pymysql.connect(
            host="10.0.0.188",
            user="lidernetwork",
            password="564652670",
            database="banco",
            cursorclass=pymysql.cursors.DictCursor
        )

        local = pymysql.connect(
            host="localhost",
            user="root",
            password="",
            database="delivery"
        )

        try:
            with remoto.cursor() as rcur, local.cursor() as lcur:
                # Buscar apenas produtos com estoque positivo
                rcur.execute("""
                    SELECT 
                        p.COD_PRO,
                        p.NOME_PRO,
                        p.VALOR_PRO,
                        p.CODIGO_BARRA_PRO,
                        COALESCE(e.ESTOQUE, 0) AS ESTOQUE,
                        COALESCE(e.ESTOQUE_NAO_FISCAL, 0) AS ESTOQUE_NAO_FISCAL
                    FROM produto p
                    INNER JOIN estoque e ON e.COD_PRO = p.COD_PRO
                    WHERE (COALESCE(e.ESTOQUE, 0) > 0 OR COALESCE(e.ESTOQUE_NAO_FISCAL, 0) > 0)
                """)
                produtos = rcur.fetchall()

                contador = 0
                for p in produtos:
                    estoque_total = float(p['ESTOQUE']) + float(p['ESTOQUE_NAO_FISCAL'])
                    sql = """
                        INSERT INTO produtos (codigo, nome, preco, codigo_barra, estoque)
                        VALUES (%s, %s, %s, %s, %s)
                        ON DUPLICATE KEY UPDATE
                            nome = VALUES(nome),
                            preco = VALUES(preco),
                            codigo_barra = VALUES(codigo_barra),
                            estoque = VALUES(estoque)
                    """
                    lcur.execute(sql, (
                        p['COD_PRO'],
                        p['NOME_PRO'],
                        p['VALOR_PRO'],
                        p['CODIGO_BARRA_PRO'],
                        estoque_total
                    ))
                    contador += 1

                local.commit()
                self.log(f"Total de produtos sincronizados: {contador}")

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