
ALTER TABLE crm.clientes
    ADD COLUMN IF NOT EXISTS nombres VARCHAR(255);

ALTER TABLE crm.clientes
    ADD COLUMN IF NOT EXISTS apellido_paterno VARCHAR(255);

ALTER TABLE crm.clientes
    ADD COLUMN IF NOT EXISTS apellido_materno VARCHAR(255);

ALTER TABLE crm.clientes
    ADD COLUMN IF NOT EXISTS documento_tipo VARCHAR(50);

ALTER TABLE crm.clientes
    ADD COLUMN IF NOT EXISTS documento_valor VARCHAR(120);

ALTER TABLE crm.clientes
    ADD COLUMN IF NOT EXISTS domicilio TEXT;

UPDATE crm.clientes
SET nombres = nombre
WHERE (nombres IS NULL OR BTRIM(nombres) = '')
  AND nombre IS NOT NULL
  AND BTRIM(nombre) <> '';

COMMENT ON COLUMN crm.clientes.nombres IS 'Nombres canonicos del cliente. En esta fase convive con crm.clientes.nombre por compatibilidad.';
COMMENT ON COLUMN crm.clientes.apellido_paterno IS 'Apellido paterno canonico del cliente.';
COMMENT ON COLUMN crm.clientes.apellido_materno IS 'Apellido materno canonico del cliente.';
COMMENT ON COLUMN crm.clientes.documento_tipo IS 'Tipo de documento de identidad del cliente. Ejemplos: INE, CURP, RFC, PASAPORTE.';
COMMENT ON COLUMN crm.clientes.documento_valor IS 'Valor del documento de identidad del cliente.';
COMMENT ON COLUMN crm.clientes.domicilio IS 'Domicilio libre canonico del cliente para contratos y cobranza.';

CREATE INDEX IF NOT EXISTS clientes_documento_valor_idx
    ON crm.clientes (business_id, documento_valor)
    WHERE documento_valor IS NOT NULL
      AND BTRIM(documento_valor) <> ''
      AND soft_delete IS NOT TRUE;

ALTER TABLE workforce.usuarios
    ADD COLUMN IF NOT EXISTS nombres VARCHAR(100);

ALTER TABLE workforce.usuarios
    ADD COLUMN IF NOT EXISTS apellido_paterno VARCHAR(100);

ALTER TABLE workforce.usuarios
    ADD COLUMN IF NOT EXISTS apellido_materno VARCHAR(100);

UPDATE workforce.usuarios
SET nombres = nombre_completo
WHERE (nombres IS NULL OR BTRIM(nombres) = '')
  AND nombre_completo IS NOT NULL
  AND BTRIM(nombre_completo) <> '';

COMMENT ON COLUMN workforce.usuarios.nombres IS 'Nombres canonicos del usuario. En esta fase convive con workforce.usuarios.nombre_completo por compatibilidad.';
COMMENT ON COLUMN workforce.usuarios.apellido_paterno IS 'Apellido paterno canonico del usuario.';
COMMENT ON COLUMN workforce.usuarios.apellido_materno IS 'Apellido materno canonico del usuario.';

ALTER TABLE commerce.planes_pago
    ADD COLUMN IF NOT EXISTS contract_folio VARCHAR(120);

ALTER TABLE commerce.planes_pago
    ADD COLUMN IF NOT EXISTS currency_code VARCHAR(3);

ALTER TABLE commerce.planes_pago
    ADD COLUMN IF NOT EXISTS fecha_firma_contrato TIMESTAMPTZ;

UPDATE commerce.planes_pago
SET fecha_firma_contrato = NULLIF(configuracion_plan->'contrato_snapshot'->>'captured_at', '')::timestamptz
WHERE fecha_firma_contrato IS NULL
  AND jsonb_exists(COALESCE(configuracion_plan->'contrato_snapshot', '{}'::jsonb), 'captured_at')
  AND NULLIF(configuracion_plan->'contrato_snapshot'->>'captured_at', '') IS NOT NULL;

ALTER TABLE commerce.planes_pago
    DROP CONSTRAINT IF EXISTS planes_pago_currency_code_chk;

ALTER TABLE commerce.planes_pago
    ADD CONSTRAINT planes_pago_currency_code_chk
    CHECK (
        currency_code IS NULL
        OR NULLIF(BTRIM(currency_code), '') IS NULL
        OR BTRIM(currency_code) ~ '^[A-Z]{3}$'
    );

COMMENT ON COLUMN commerce.planes_pago.contract_folio IS 'Folio legal visible del contrato. Distinto de id_plan cuando el negocio requiera numeracion contractual propia.';
COMMENT ON COLUMN commerce.planes_pago.currency_code IS 'Codigo ISO 4217 de moneda congelado al momento contractual. Ejemplos: MXN, USD, EUR.';
COMMENT ON COLUMN commerce.planes_pago.fecha_firma_contrato IS 'Fecha y hora efectiva de firma o captura contractual.';

CREATE UNIQUE INDEX IF NOT EXISTS planes_pago_contract_folio_uq
    ON commerce.planes_pago (business_id, contract_folio)
    WHERE contract_folio IS NOT NULL
      AND BTRIM(contract_folio) <> ''
      AND soft_delete IS NOT TRUE;

ALTER TABLE catalog.inventario
    ADD COLUMN IF NOT EXISTS codigo_externo VARCHAR(120);

COMMENT ON COLUMN catalog.inventario.codigo_externo IS 'Codigo comercial externo o SKU visible del producto/servicio.';

CREATE UNIQUE INDEX IF NOT EXISTS inventario_codigo_externo_uq
    ON catalog.inventario (business_id, codigo_externo)
    WHERE codigo_externo IS NOT NULL
      AND BTRIM(codigo_externo) <> ''
      AND soft_delete IS NOT TRUE;

ALTER TABLE platform.configuraciones
    ADD COLUMN IF NOT EXISTS representante_negocio_nombre VARCHAR(255);

ALTER TABLE platform.configuraciones
    ADD COLUMN IF NOT EXISTS lugar_firma_contrato VARCHAR(255);

COMMENT ON COLUMN platform.configuraciones.representante_negocio_nombre IS 'Nombre del representante legal o firmante del negocio para contratos.';
COMMENT ON COLUMN platform.configuraciones.lugar_firma_contrato IS 'Lugar visible de firma contractual por negocio o sucursal.';

ANALYZE crm.clientes;
ANALYZE workforce.usuarios;
ANALYZE commerce.planes_pago;
ANALYZE catalog.inventario;
ANALYZE platform.configuraciones;
