-- Nonces e confirmacoes idempotentes; nenhuma credencial e persistida aqui.
CREATE TABLE IF NOT EXISTS t2_sync_nonce (
 nonce CHAR(64) PRIMARY KEY, criado DATETIME(3) NOT NULL DEFAULT (UTC_TIMESTAMP(3)), INDEX(criado)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS t2_sync_ack (
 operacao CHAR(36) PRIMARY KEY, hash_payload CHAR(64) NOT NULL,
 confirmado DATETIME(3) NOT NULL DEFAULT (UTC_TIMESTAMP(3))
) ENGINE=InnoDB;
DELIMITER $$
DROP PROCEDURE IF EXISTS t2_sync_confirmar$$
CREATE PROCEDURE t2_sync_confirmar(IN p_op CHAR(36),IN p_hash CHAR(64))
proc: BEGIN
 DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN ROLLBACK; RESIGNAL; END;
 START TRANSACTION;
 IF EXISTS(SELECT 1 FROM t2_sync_ack WHERE operacao=p_op AND hash_payload=p_hash) THEN COMMIT; LEAVE proc; END IF;
 UPDATE t2_sync_fila SET estado=IF(versao=versao_envio,'concluido','pendente'),
  operacao=NULL,payload=NULL,hash_payload=NULL,versao_envio=NULL,tentativas=0,
  proxima_tentativa=UTC_TIMESTAMP(3),erro_codigo=NULL
 WHERE operacao=p_op AND hash_payload=p_hash AND estado='pendente';
 IF ROW_COUNT()<>1 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='SYNC_CONFIRMACAO_INVALIDA'; END IF;
 INSERT INTO t2_sync_ack(operacao,hash_payload) VALUES(p_op,p_hash);
 COMMIT;
END$$
DELIMITER ;
