--
-- Copyright (c) 2025 SUSE
--
-- This software is licensed to you under the GNU General Public License,
-- version 2 (GPLv2). There is NO WARRANTY for this software, express or
-- implied, including the implied warranties of MERCHANTABILITY or FITNESS
-- FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
-- along with this software; if not, see
-- http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
--

CREATE TABLE IF NOT EXISTS suseScapContent
(
    id            BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    name          VARCHAR(255) NOT NULL,
    description   TEXT,
    datastream_file_name TEXT NOT NULL,
    xccdf_file_name TEXT NOT NULL,
    created       TIMESTAMPTZ DEFAULT current_timestamp NOT NULL,
    modified      TIMESTAMPTZ DEFAULT current_timestamp NOT NULL
);

CREATE UNIQUE INDEX IF NOT EXISTS suseScapContent_name_uq
    ON suseScapContent (name);


CREATE TABLE IF NOT EXISTS suseScapTailoringFile
(
    id                   BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    name                 VARCHAR(255) NOT NULL,
    file_name            TEXT NOT NULL,
    description          TEXT,
    org_id               BIGINT NOT NULL
                         CONSTRAINT suse_tailoringf_oid_fk
                           REFERENCES web_customer (id)
                           ON DELETE CASCADE,
    created              TIMESTAMPTZ DEFAULT current_timestamp NOT NULL,
    modified             TIMESTAMPTZ DEFAULT current_timestamp NOT NULL
);

CREATE UNIQUE INDEX IF NOT EXISTS suseScapTailoringFile_org_id_name_uq
ON suseScapTailoringFile (org_id, name);


CREATE TABLE IF NOT EXISTS suseScapPolicy
(
    id                   BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    policy_name          VARCHAR(255) NOT NULL,
    description          TEXT,
    scap_content_id      BIGINT NOT NULL
                         CONSTRAINT suse_scap_policy_content_fk
                         REFERENCES suseScapContent (id)
                         ON DELETE RESTRICT,
    xccdf_profile_id     TEXT NOT NULL,
    tailoring_file       BIGINT
                         CONSTRAINT suse_scap_policy_tailoring_fk
                         REFERENCES suseScapTailoringFile (id)
                         ON DELETE RESTRICT,

    tailoring_profile_id TEXT,
    oval_files           TEXT,
    advanced_args        TEXT,
    fetch_remote_resources BOOLEAN NOT NULL DEFAULT FALSE,
    org_id               BIGINT NOT NULL
                         CONSTRAINT suse_scap_policy_org_fk
                         REFERENCES web_customer (id)
                         ON DELETE CASCADE,                         
    created              TIMESTAMPTZ DEFAULT current_timestamp NOT NULL,
    modified             TIMESTAMPTZ DEFAULT current_timestamp NOT NULL
);

CREATE UNIQUE INDEX IF NOT EXISTS suseScapPolicy_org_id_name_uq
ON suseScapPolicy (org_id, policy_name);


CREATE TABLE IF NOT EXISTS suseXccdfRuleFix
(
    id                   BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    identifier           TEXT NOT NULL,
    remediation          TEXT NOT NULL,
    benchmark_identifier TEXT NOT NULL
);

CREATE UNIQUE INDEX IF NOT EXISTS suseXccdfRuleFix_identifier_benchmark_uq
    ON suseXccdfRuleFix (identifier, benchmark_identifier);


CREATE TABLE IF NOT EXISTS suseXccdfRuleFixCustom
(
    id                          BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    rule_fix_id                 BIGINT NOT NULL
                                   CONSTRAINT suse_xccdf_rulefixcustom_fix_fk
                                   REFERENCES suseXccdfRuleFix (id)
                                   ON DELETE CASCADE,
    org_id                      BIGINT NOT NULL
                                   CONSTRAINT suse_xccdf_rulefixcustom_org_fk
                                   REFERENCES web_customer (id)
                                   ON DELETE CASCADE,
    custom_remediation_bash     TEXT,
    custom_remediation_salt     TEXT,
    created                     TIMESTAMPTZ DEFAULT current_timestamp NOT NULL,
    modified                    TIMESTAMPTZ DEFAULT current_timestamp NOT NULL,
    created_by                  BIGINT
                                   CONSTRAINT suse_xccdf_rulefixcustom_cby_fk
                                   REFERENCES web_contact (id)
                                   ON DELETE SET NULL,
    modified_by                 BIGINT
                                   CONSTRAINT suse_xccdf_rulefixcustom_mby_fk
                                   REFERENCES web_contact (id)
                                   ON DELETE SET NULL,
    CONSTRAINT check_at_least_one_custom CHECK (
        custom_remediation_bash IS NOT NULL OR 
        custom_remediation_salt IS NOT NULL
    )
);

CREATE UNIQUE INDEX IF NOT EXISTS suseXccdfRuleFixCustom_rulefix_org_uq
    ON suseXccdfRuleFixCustom (rule_fix_id, org_id);


CREATE TABLE IF NOT EXISTS suseRecurringScapPolicy
(
    rec_id            BIGINT PRIMARY KEY
                      REFERENCES suseRecurringAction(id) ON DELETE CASCADE,
    
    test_mode         CHAR(1) NOT NULL DEFAULT 'N',
    
    scap_policy_id    BIGINT
                      REFERENCES suseScapPolicy(id) ON DELETE CASCADE
);
