
CREATE SCHEMA IF NOT EXISTS crm;

CREATE TABLE IF NOT EXISTS crm.clientes (
    LIKE public.clientes INCLUDING ALL
);

CREATE TABLE IF NOT EXISTS crm.reportes (
    LIKE public.reportes INCLUDING ALL
);

CREATE TABLE IF NOT EXISTS crm.preguntas_clasificacion_multi (
    LIKE public.preguntas_clasificacion_multi INCLUDING ALL
);

-- Reset data in deterministic order (parent-first for FK-safe load paths, no-op on empty target).
TRUNCATE TABLE
    crm.reportes,
    crm.preguntas_clasificacion_multi,
    crm.clientes
;

INSERT INTO crm.clientes
OVERRIDING SYSTEM VALUE
SELECT
    *
FROM public.clientes;

INSERT INTO crm.preguntas_clasificacion_multi
SELECT
    *
FROM public.preguntas_clasificacion_multi;

INSERT INTO crm.reportes
OVERRIDING SYSTEM VALUE
SELECT
    *
FROM public.reportes;

-- Reinstate identity sequences with local schema affinity in crm.
CREATE SEQUENCE IF NOT EXISTS crm.preguntas_clasificacion_multi_pregunta_id_seq
    AS integer
    OWNED BY crm.preguntas_clasificacion_multi.pregunta_id;

ALTER TABLE crm.preguntas_clasificacion_multi
    ALTER COLUMN pregunta_id
    DROP DEFAULT;

ALTER TABLE crm.preguntas_clasificacion_multi
    ALTER COLUMN pregunta_id
    SET DEFAULT nextval('crm.preguntas_clasificacion_multi_pregunta_id_seq'::regclass);

SELECT setval(
    pg_get_serial_sequence('crm.clientes', 'id_cliente'),
    COALESCE((SELECT MAX(id_cliente) FROM crm.clientes), 1),
    COALESCE((SELECT MAX(id_cliente) FROM crm.clientes), 0) > 0
);

SELECT setval(
    pg_get_serial_sequence('crm.reportes', 'id_reporte'),
    COALESCE((SELECT MAX(id_reporte) FROM crm.reportes), 1),
    COALESCE((SELECT MAX(id_reporte) FROM crm.reportes), 0) > 0
);

SELECT setval(
    'crm.preguntas_clasificacion_multi_pregunta_id_seq',
    COALESCE((SELECT MAX(pregunta_id) FROM crm.preguntas_clasificacion_multi), 1),
    COALESCE((SELECT MAX(pregunta_id) FROM crm.preguntas_clasificacion_multi), 0) > 0
);

-- Rebind FK constraints to the CRM domain.
ALTER TABLE crm.reportes
    DROP CONSTRAINT IF EXISTS reportes_id_cliente_fkey;

ALTER TABLE crm.reportes
    ADD CONSTRAINT reportes_id_cliente_fkey
    FOREIGN KEY (id_cliente)
    REFERENCES crm.clientes (id_cliente)
    ON DELETE SET NULL
    ON UPDATE CASCADE;

ANALYZE crm.clientes;
ANALYZE crm.preguntas_clasificacion_multi;
ANALYZE crm.reportes;
