ALTER TABLE IF EXISTS public.ordini
ALTER COLUMN servizio_id
DROP NOT NULL;

ALTER TABLE IF EXISTS public.ordini
ADD COLUMN IF NOT EXISTS rinnovo_id UUID;

CREATE TABLE IF NOT EXISTS public.rinnovi (
    id UUID NOT NULL DEFAULT gen_random_uuid (),
    "userId" UUID NOT NULL,
    codice TEXT NOT NULL,
    decorrenza TIMESTAMP WITHOUT TIME ZONE NOT NULL,
    scadenza timestamp without time zone NOT NULL,
    gestionale_id TEXT
);

DO $$ BEGIN IF NOT EXISTS (
    SELECT 1 FROM pg_constraint 
    WHERE conname = 'rinnovo_user_fkey'
    ) THEN
        ALTER TABLE public.rinnovi 
        ADD CONSTRAINT rinnovo_user_fkey 
        FOREIGN KEY ("userId") REFERENCES public.users (id) 
        ON UPDATE CASCADE ON DELETE CASCADE;
    END IF;
END $$;
-- Primary Key
DO $$ 
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM pg_constraint 
        WHERE conname = 'rinnovi_pkey' 
        AND conrelid = 'public.rinnovi'::regclass
    ) THEN
        ALTER TABLE public.rinnovi
        ADD CONSTRAINT rinnovi_pkey PRIMARY KEY (id);
    END IF;
END $$;

DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'ordine_rinnovo_fkey') THEN
        ALTER TABLE public.ordini
        ADD CONSTRAINT ordine_rinnovo_fkey FOREIGN KEY (rinnovo_id) REFERENCES public.rinnovi (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE NOT VALID;
    END IF;
END;
$$;

DO $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'only_one_service') THEN
        ALTER TABLE public.ordini
        ADD CONSTRAINT only_one_service CHECK (
            (
                servizio_id IS NOT NULL
                AND rinnovo_id IS NULL
            )
            OR (
                servizio_id IS NULL
                AND rinnovo_id IS NOT NULL
            )
        ) NOT VALID;
    END IF;
END;
$$;

ALTER TABLE IF EXISTS public.prezziario
ADD COLUMN IF NOT EXISTS order_type "OrderTypeEnum";

ALTER TABLE IF EXISTS public.prezziario
ADD COLUMN IF NOT EXISTS service_type "TipologiaPosizioneEnum";

UPDATE public.prezziario
SET
    service_type = 'Transitorio'
WHERE
    idprezziario = 'ACCONTO_BD'
    OR idprezziario LIKE 'SALDOBD%'
    OR idprezziario = 'CONS_TRANS'
    OR idprezziario = 'CONS_30GG';

UPDATE public.prezziario
SET
    service_type = 'Stabile'
WHERE
    idprezziario = 'ACCONTO_CA'
    OR idprezziario LIKE 'SALDOCA%'
    OR idprezziario = 'CONS_COMM'
    OR idprezziario = 'CONS_4+4'
    OR idprezziario = 'CONS_3+2';

UPDATE public.prezziario
SET
    order_type = 'Acconto'
WHERE
    idprezziario LIKE 'ACCONTO%';

UPDATE public.prezziario
SET
    order_type = 'Saldo'
WHERE
    idprezziario LIKE 'SALDO%';

UPDATE public.prezziario
SET
    order_type = 'Consulenza'
WHERE
    idprezziario LIKE 'CONS%';

ALTER TABLE IF EXISTS public.prezziario
DROP COLUMN IF EXISTS "isAcconto";

ALTER TABLE IF EXISTS public.prezziario
DROP COLUMN IF EXISTS "isSaldo";

ALTER TABLE IF EXISTS public.prezziario
DROP COLUMN IF EXISTS "isConsulenza";

ALTER TABLE IF EXISTS public.prezziario
DROP COLUMN IF EXISTS "isStabile";

ALTER TABLE IF EXISTS public.prezziario
DROP COLUMN IF EXISTS "isTransitorio";

ALTER TABLE IF EXISTS public.prezziario
ADD COLUMN IF NOT EXISTS service_variant integer;

UPDATE public.prezziario
SET
    service_variant = 4
WHERE
    idprezziario = 'SALDOBD_12MESI';

UPDATE public.prezziario
SET
    service_variant = 0
WHERE
    idprezziario = 'SALDOBD_1MESE';

UPDATE public.prezziario
SET
    service_variant = 1
WHERE
    idprezziario = 'SALDOBD_3MESI';

UPDATE public.prezziario
SET
    service_variant = 2
WHERE
    idprezziario = 'SALDOBD_6MESI';

UPDATE public.prezziario
SET
    service_variant = 3
WHERE
    idprezziario = 'SALDOBD_9MESI';

UPDATE public.prezziario
SET
    service_variant = 0
WHERE
    idprezziario = 'SALDOCA500';

UPDATE public.prezziario
SET
    service_variant = 1
WHERE
    idprezziario = 'SALDOCA500+';

UPDATE public.prezziario
SET
    service_variant = 2
WHERE
    idprezziario = 'SALDOCA700+';

INSERT INTO
    public.prezziario (
        idprezziario,
        prezzo_cent,
        testo_condizioni,
        "isActive",
        nome_it,
        nome_en,
        desc_it,
        desc_en,
        sconto,
        order_type,
        service_type,
        service_variant
    )
VALUES (
        'CERCO_BD365',
        46000,
        'CONDIZIONI_CERCHI',
        TRUE,
        'Rinnovo permanenza 12 mesi',
        'Renewal 12 months',
        'Rinnovo permanenza 12 mesi',
        'Renewal 12 months',
        0,
        'Rinnovo',
        'Transitorio',
        4
    ),
    (
        'CERCO_BD30',
        8000,
        'CONDIZIONI_CERCHI',
        TRUE,
        'Rinnovo permanenza 1 mese',
        'Renewal 1 month',
        'Rinnovo permanenza 1 mese',
        'Renewal 1 month',
        0,
        'Rinnovo',
        'Transitorio',
        0
    ),
    (
        'CERCO_BD90',
        25000,
        'CONDIZIONI_CERCHI',
        TRUE,
        'Rinnovo permanenza 3 mesi',
        'Renewal 3 months',
        'Rinnovo permanenza 3 mesi',
        'Renewal 3 months',
        0,
        'Rinnovo',
        'Transitorio',
        1
    ),
    (
        'CERCO_BD180',
        36000,
        'CONDIZIONI_CERCHI',
        TRUE,
        'Rinnovo permanenza 6 mesi',
        'Renewal 6 months',
        'Rinnovo permanenza 6 mesi',
        'Renewal 6 months',
        0,
        'Rinnovo',
        'Transitorio',
        2
    ),
    (
        'CERCO_BD270',
        41000,
        'CONDIZIONI_CERCHI',
        TRUE,
        'Rinnovo permanenza 9 mesi',
        'Renewal 9 months',
        'Rinnovo permanenza 9 mesi',
        'Renewal 9 months',
        0,
        'Rinnovo',
        'Transitorio',
        3
    )
ON CONFLICT (idprezziario) DO NOTHING;