# frozen_string_literal: true

# From this migration, we save the chained elements in a separate table instead of adding footprints in their tables (like in invoices)
# This will allows more flexibility for the models
class CreateChainedElements < ActiveRecord::Migration[6.1]
  def up
    create_table :chained_elements do |t|
      t.references :element, index: true, polymorphic: true, null: false
      t.integer :previous_id
      t.foreign_key :chained_elements, column: :previous_id, primary_key: :id
      t.jsonb :content, null: false
      t.string :footprint, null: false

      t.timestamps
    end

    execute <<~SQL.squish
      CREATE OR REPLACE RULE chained_elements_upd_protect AS ON UPDATE
      TO chained_elements
      WHERE (
        new.content <> old.content OR
        new.footprint <> old.footprint OR
        new.previous_id <> old.previous_id OR
        new.element_id <> old.element_id OR
        new.element_type <> old.element_type)
      DO INSTEAD NOTHING;
    SQL
  end

  def down
    execute <<~SQL.squish
      DROP RULE IF EXISTS chained_elements_upd_protect ON chained_elements;
    SQL
    drop_table :chained_elements
  end
end