-- Estrutura inicial para integracao Mercado Pago / Marketplace Bulo.
-- Mantem o fluxo atual funcionando e adiciona rastreabilidade de gateway.

CREATE TABLE IF NOT EXISTS mercado_pago_contas (
  id INT AUTO_INCREMENT PRIMARY KEY,
  id_usuario INT NOT NULL,
  tipo_usuario ENUM('motorista', 'passageiro', 'plataforma') NOT NULL,
  mp_user_id VARCHAR(80) NULL,
  mp_nickname VARCHAR(120) NULL,
  mp_email VARCHAR(160) NULL,
  access_token TEXT NULL,
  refresh_token TEXT NULL,
  token_expires_at DATETIME NULL,
  public_key VARCHAR(160) NULL,
  status ENUM('nao_conectado', 'pendente', 'conectado', 'desconectado', 'erro') NOT NULL DEFAULT 'pendente',
  modo ENUM('sandbox', 'producao') NOT NULL DEFAULT 'sandbox',
  observacao VARCHAR(255) NULL,
  conectado_em DATETIME NULL,
  desconectado_em DATETIME NULL,
  atualizado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uk_mp_conta_usuario_tipo (id_usuario, tipo_usuario),
  INDEX idx_mp_contas_status (status),
  CONSTRAINT fk_mp_contas_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS pagamentos_corridas (
  id INT AUTO_INCREMENT PRIMARY KEY,
  id_corrida INT NULL,
  id_passageiro INT NULL,
  id_motorista INT NULL,
  provedor ENUM('mercado_pago') NOT NULL DEFAULT 'mercado_pago',
  ambiente ENUM('sandbox', 'producao') NOT NULL DEFAULT 'sandbox',
  external_reference VARCHAR(160) NOT NULL,
  mp_payment_id VARCHAR(100) NULL,
  mp_preference_id VARCHAR(100) NULL,
  mp_customer_id VARCHAR(100) NULL,
  mp_card_id VARCHAR(100) NULL,
  metodo ENUM('pix_online', 'cartao_credito', 'dinheiro_pix') NOT NULL,
  status ENUM('criado', 'pendente', 'autorizado', 'aprovado', 'recusado', 'cancelado', 'estornado', 'erro') NOT NULL DEFAULT 'criado',
  valor_total DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  valor_motorista DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  valor_plataforma DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  taxa_gateway DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  application_fee DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  raw_request JSON NULL,
  raw_response JSON NULL,
  erro_mensagem VARCHAR(255) NULL,
  criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  atualizado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY uk_pagamentos_external_reference (external_reference),
  INDEX idx_pagamentos_corrida (id_corrida),
  INDEX idx_pagamentos_status (status),
  INDEX idx_pagamentos_motorista (id_motorista),
  CONSTRAINT fk_pagamentos_corrida FOREIGN KEY (id_corrida) REFERENCES corridas(id) ON DELETE SET NULL,
  CONSTRAINT fk_pagamentos_passageiro FOREIGN KEY (id_passageiro) REFERENCES usuarios(id) ON DELETE SET NULL,
  CONSTRAINT fk_pagamentos_motorista FOREIGN KEY (id_motorista) REFERENCES usuarios(id) ON DELETE SET NULL
);

CREATE TABLE IF NOT EXISTS pagamento_eventos_webhook (
  id INT AUTO_INCREMENT PRIMARY KEY,
  provedor ENUM('mercado_pago') NOT NULL DEFAULT 'mercado_pago',
  event_id VARCHAR(120) NULL,
  event_type VARCHAR(80) NULL,
  resource_id VARCHAR(120) NULL,
  acao VARCHAR(80) NULL,
  payload JSON NULL,
  processado TINYINT(1) NOT NULL DEFAULT 0,
  erro VARCHAR(255) NULL,
  criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uk_mp_webhook_event (provedor, event_id),
  INDEX idx_mp_webhook_resource (resource_id),
  INDEX idx_mp_webhook_processado (processado)
);

CREATE TABLE IF NOT EXISTS mercado_pago_configuracoes (
  chave VARCHAR(80) PRIMARY KEY,
  valor TEXT NULL,
  descricao VARCHAR(255) NULL,
  sensivel TINYINT(1) NOT NULL DEFAULT 0,
  atualizado_por VARCHAR(80) NULL,
  atualizado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE IF NOT EXISTS mercado_pago_oauth_states (
  id INT AUTO_INCREMENT PRIMARY KEY,
  state VARCHAR(96) NOT NULL,
  id_usuario INT NOT NULL,
  tipo_usuario ENUM('motorista', 'passageiro', 'plataforma') NOT NULL DEFAULT 'motorista',
  redirect_uri VARCHAR(255) NOT NULL,
  code_verifier VARCHAR(160) NULL,
  usado TINYINT(1) NOT NULL DEFAULT 0,
  erro VARCHAR(255) NULL,
  criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  expira_em DATETIME NOT NULL,
  UNIQUE KEY uk_mp_oauth_state (state),
  INDEX idx_mp_oauth_usuario (id_usuario, tipo_usuario),
  CONSTRAINT fk_mp_oauth_usuario FOREIGN KEY (id_usuario) REFERENCES usuarios(id) ON DELETE CASCADE
);

ALTER TABLE mercado_pago_oauth_states
  ADD COLUMN IF NOT EXISTS code_verifier VARCHAR(160) NULL AFTER redirect_uri;

ALTER TABLE passageiro_cartoes
  ADD COLUMN IF NOT EXISTS mp_customer_id VARCHAR(100) NULL AFTER token_gateway,
  ADD COLUMN IF NOT EXISTS mp_card_id VARCHAR(100) NULL AFTER mp_customer_id,
  ADD COLUMN IF NOT EXISTS mp_payment_method_id VARCHAR(60) NULL AFTER mp_card_id,
  ADD COLUMN IF NOT EXISTS token_status ENUM('referencia', 'tokenizado', 'removido', 'erro') NOT NULL DEFAULT 'referencia' AFTER mp_payment_method_id,
  ADD COLUMN IF NOT EXISTS observacao_gateway VARCHAR(255) NULL AFTER token_status;

ALTER TABLE passageiro_pix_recargas
  ADD COLUMN IF NOT EXISTS id_pagamento_gateway INT NULL AFTER id_passageiro,
  ADD COLUMN IF NOT EXISTS mp_payment_id VARCHAR(100) NULL AFTER txid,
  ADD COLUMN IF NOT EXISTS external_reference VARCHAR(160) NULL AFTER mp_payment_id;

ALTER TABLE corridas
  ADD COLUMN IF NOT EXISTS id_pagamento_gateway INT NULL AFTER forma_pagamento_detalhe,
  ADD COLUMN IF NOT EXISTS status_pagamento ENUM('nao_aplicavel', 'pendente', 'autorizado', 'aprovado', 'recusado', 'cancelado', 'estornado', 'erro') NOT NULL DEFAULT 'nao_aplicavel' AFTER id_pagamento_gateway,
  ADD COLUMN IF NOT EXISTS valor_motorista_liquido DECIMAL(10,2) NULL AFTER valor,
  ADD COLUMN IF NOT EXISTS valor_plataforma_bruto DECIMAL(10,2) NULL AFTER valor_motorista_liquido,
  ADD COLUMN IF NOT EXISTS taxa_gateway DECIMAL(10,2) NULL AFTER valor_plataforma_bruto,
  ADD COLUMN IF NOT EXISTS mp_payment_id VARCHAR(100) NULL AFTER status_pagamento,
  ADD COLUMN IF NOT EXISTS mp_external_reference VARCHAR(160) NULL AFTER mp_payment_id;

INSERT INTO configuracoes (chave, valor, descricao)
VALUES
  ('mp_ambiente_sandbox', 1.00, 'Mercado Pago em modo sandbox: 1 sim, 0 producao'),
  ('mp_marketplace_ativo', 0.00, 'Marketplace Mercado Pago ativo: 1 sim, 0 nao'),
  ('mp_taxa_gateway_percentual', 0.00, 'Percentual estimado cobrado pelo gateway, usado somente para conferencia')
ON DUPLICATE KEY UPDATE descricao = VALUES(descricao);

INSERT INTO mercado_pago_configuracoes (chave, valor, descricao, sensivel)
VALUES
  ('mp_client_id', NULL, 'Client ID do aplicativo Mercado Pago', 0),
  ('mp_client_secret', NULL, 'Client Secret do aplicativo Mercado Pago', 1),
  ('mp_public_key', NULL, 'Public Key da plataforma para Checkout Transparente', 0),
  ('mp_access_token_plataforma', NULL, 'Access Token da conta plataforma', 1),
  ('mp_redirect_uri', 'http://localhost/bulo_backend/auth/mercado_pago_callback.php', 'URL de retorno OAuth cadastrada no Mercado Pago', 0),
  ('mp_webhook_url', 'http://localhost/bulo_backend/pagamentos/mercado_pago_webhook.php', 'URL de webhook cadastrada no Mercado Pago', 0)
ON DUPLICATE KEY UPDATE
  descricao = VALUES(descricao),
  sensivel = VALUES(sensivel);
