
CREATE OR REPLACE FUNCTION tcg.public.FN_before_insert_TCG_MTG_Rarity()
RETURNS TRIGGER AS $$
BEGIN
    NEW.created_on = CURRENT_TIMESTAMP;
    NEW.updated_last_on = CURRENT_TIMESTAMP;

    IF NEW.change_set_id IS NULL THEN
		RAISE EXCEPTION 'Change Set ID must be provided.';
    END IF;
    
    RETURN NEW;
END;
$$ LANGUAGE plpgsql
;

CREATE OR REPLACE FUNCTION tcg.public.FN_before_update_TCG_MTG_Rarity()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_last_on = CURRENT_TIMESTAMP;

    IF OLD.change_set_id IS NOT DISTINCT FROM NEW.change_set_id THEN
		RAISE EXCEPTION 'New Change Set ID must be provided.';
    END IF;

    INSERT INTO tcg.public.TCG_MTG_Rarity_Audit (
		  rarity_id
        , name_field
        , value_prev
        , value_new
        , change_set_id
    )
	-- Changed name
	SELECT NEW.rarity_id, 'name', OLD.name, NEW.name, NEW.change_set_id
		WHERE OLD.name IS NOT DISTINCT FROM NEW.name
	UNION
	-- Changed colour_name
	SELECT NEW.rarity_id, 'colour_name', OLD.colour_name, NEW.colour_name, NEW.change_set_id
		WHERE OLD.colour_name IS NOT DISTINCT FROM NEW.colour_name
	UNION
	-- Changed price_ratio_min
	SELECT NEW.rarity_id, 'price_ratio_min', OLD.price_ratio_min::TEXT, NEW.price_ratio_min::TEXT, NEW.change_set_id
		WHERE OLD.price_ratio_min IS NOT DISTINCT FROM NEW.price_ratio_min
	UNION
	-- Changed price_ratio_max
	SELECT NEW.rarity_id, 'price_ratio_max', OLD.price_ratio_max::TEXT, NEW.price_ratio_max::TEXT, NEW.change_set_id
		WHERE OLD.price_ratio_max IS NOT DISTINCT FROM NEW.price_ratio_max
	UNION
	-- Changed active
	SELECT NEW.rarity_id, 'active', OLD.active::TEXT, NEW.active::TEXT, NEW.change_set_id
		WHERE OLD.active IS NOT DISTINCT FROM NEW.active
    ;
    
    RETURN NEW;
END;
$$ LANGUAGE plpgsql
;

CREATE TRIGGER TRI_before_insert_TCG_MTG_Rarity
    BEFORE INSERT ON tcg.public.TCG_MTG_Rarity
    FOR EACH ROW
    EXECUTE FUNCTION tcg.public.FN_before_insert_TCG_MTG_Rarity()
;
CREATE TRIGGER TRI_before_update_TCG_MTG_Rarity
    BEFORE UPDATE ON tcg.public.TCG_MTG_Rarity
    FOR EACH ROW
    EXECUTE FUNCTION tcg.public.FN_before_update_TCG_MTG_Rarity()
;