-- Proposta de camada de apoio para a virada de
-- empresas/unidades legadas -> contratos (empresa/unidade).
--
-- Objetivo:
-- 1) manter um vinculo explicito profissional -> contrato
-- 2) tratar contratos do tipo UNIDADE como fonte de endereco presencial
-- 3) permitir refatoracao progressiva sem depender apenas de usuario_contratos

CREATE TABLE IF NOT EXISTS `wpjy_parceiros_profissionais_contratos` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `id_profissional` INT NOT NULL,
    `id_contrato` INT NOT NULL,
    `tipo_vinculo` ENUM('EMPRESA', 'UNIDADE') NOT NULL,
    `principal` TINYINT(1) NOT NULL DEFAULT '0',
    `ativo` TINYINT(1) NOT NULL DEFAULT '1',
    `origem` ENUM('usuario_contratos', 'manual', 'migracao') NOT NULL DEFAULT 'usuario_contratos',
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`) USING BTREE,
    UNIQUE KEY `uq_profissional_contrato` (`id_profissional`, `id_contrato`) USING BTREE,
    KEY `idx_contrato_ativo` (`id_contrato`, `ativo`) USING BTREE,
    KEY `idx_profissional_ativo` (`id_profissional`, `ativo`) USING BTREE,
    CONSTRAINT `fk_ppc_profissional`
        FOREIGN KEY (`id_profissional`) REFERENCES `wpjy_parceiros_profissionais` (`id`)
        ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT `fk_ppc_contrato`
        FOREIGN KEY (`id_contrato`) REFERENCES `wpjy_contratos` (`id`)
        ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

-- Backfill inicial a partir de usuario_contratos.
-- Aqui entram apenas contratos EMPRESA/UNIDADE.
INSERT IGNORE INTO wpjy_parceiros_profissionais_contratos (
    id_profissional,
    id_contrato,
    tipo_vinculo,
    principal,
    ativo,
    origem
)
SELECT
    p.id AS id_profissional,
    c.id AS id_contrato,
    CASE
        WHEN UPPER(c.tipo) IN ('UNIDADE', 'UNIT') THEN 'UNIDADE'
        ELSE 'EMPRESA'
    END AS tipo_vinculo,
    0 AS principal,
    1 AS ativo,
    'usuario_contratos' AS origem
FROM wpjy_parceiros_profissionais p
JOIN wpjy_usuario_contratos uc
  ON uc.id_usuario = p.user_id
JOIN wpjy_contratos c
  ON c.id = uc.id_contrato
WHERE p.user_id IS NOT NULL
  AND p.user_id > 0
  AND UPPER(c.tipo) IN ('EMPRESA', 'UNIDADE', 'UNIT');

-- Marca 1 unidade principal por profissional.
UPDATE wpjy_parceiros_profissionais_contratos ppc
JOIN (
    SELECT
        id_profissional,
        MIN(id_contrato) AS id_contrato_principal
    FROM wpjy_parceiros_profissionais_contratos
    WHERE ativo = 1
      AND tipo_vinculo = 'UNIDADE'
    GROUP BY id_profissional
) base
  ON base.id_profissional = ppc.id_profissional
 AND base.id_contrato_principal = ppc.id_contrato
SET ppc.principal = 1
WHERE ppc.tipo_vinculo = 'UNIDADE';

-- View util para a agenda/catalogo:
-- traz a unidade, a empresa pai e o endereco vindo do contrato.
CREATE OR REPLACE VIEW `vw_parceiros_profissionais_contratos_ativos` AS
SELECT
    ppc.id_profissional,
    ppc.id_contrato                         AS contrato_unidade_id,
    ppc.principal,
    ppc.ativo,
    ppc.origem,
    c.contrato_pai                         AS contrato_empresa_id,
    COALESCE(c.nome_fantasia, c.nome)      AS unidade_nome,
    COALESCE(emp.nome_fantasia, emp.nome)  AS empresa_nome,
    c.tipo                                 AS unidade_tipo,
    c.email                                AS unidade_email,
    c.telefonewhatsapp                     AS unidade_telefone,
    c.cep,
    c.logradouro,
    c.numero,
    c.complemento,
    c.bairro,
    c.cidade,
    c.uf
FROM wpjy_parceiros_profissionais_contratos ppc
JOIN wpjy_contratos c
  ON c.id = ppc.id_contrato
LEFT JOIN wpjy_contratos emp
  ON emp.id = c.contrato_pai
WHERE ppc.ativo = 1
  AND ppc.tipo_vinculo = 'UNIDADE';

-- Consulta de conferencia.
SELECT *
FROM vw_parceiros_profissionais_contratos_ativos
ORDER BY id_profissional, principal DESC, contrato_unidade_id;
