ALTER TABLE product_paint ADD COLUMN visual_order NUMERIC DEFAULT NULL;

-- Contraint of visual_order per product_id
ALTER TABLE product_paint ADD CONSTRAINT visual_order_per_productid UNIQUE (product_id, visual_order);

-- Create function that will automatically assign a sequential visual_order to new rows if the visual_order is not provided
-- in the insert.
CREATE OR REPLACE FUNCTION enforce_sequential_visual_order()
RETURNS TRIGGER AS $$
DECLARE
    max_visual_order INT;
BEGIN
    -- Get the current max value of visual_order for the given product_id
    SELECT COALESCE(MAX(visual_order), -1) INTO max_visual_order
    FROM product_paint
    WHERE product_id = NEW.product_id;

    -- Set visual_order to the next sequential number
    NEW.visual_order := max_visual_order + 1;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- Activate the trigger
CREATE TRIGGER enforce_sequential_visual_order
BEFORE INSERT ON product_paint
FOR EACH ROW
WHEN (NEW.visual_order IS NULL) -- Only auto-assign if visual_order is not provided
EXECUTE FUNCTION enforce_sequential_visual_order();
