# Uma PARADA do romaneio — vira uma linha da tabela do PDF.
#
# ⚠️ "linhas" e não "itens": "RomaneioItem".tableize dá `romaneio_items`, e o
# inflector pt-BR do projeto (config/initializers/inflections.rb) não conhece
# item/itens — ensiná-lo renomearia todo `item`/`items` do app. `RomaneioLinha`
# pluraliza sozinho, e `linhas` já é a palavra que os serviços usam
# (PlanilhaEntregas#linhas, PlanilhaCarga#linhas). Travado em
# spec/models/table_names_spec.rb, que existe porque ConsolidacaoMotorista já
# quebrou em produção por causa do inflector.
#
# `chave_origem` é a identidade ESTÁVEL entre reimportações: a NF quando existe,
# senão "T:<md5(titulo|endereco)>". Sem esse fallback, duas linhas cujo "Título" não
# casa o padrão "NF n - NOME" colidiriam no índice único e a importação inteira
# estouraria. Veículo e ordem NÃO entram na chave: eles mudam quando o plano é
# reotimizado, e a linha continua sendo a mesma entrega.
#
# `origem`          = snapshot do que o PLANO trouxe na última importação (para o
#                     diff e para o botão "restaurar do plano").
# `campos_editados` = nomes dos campos que o operador sobrescreveu. É ISTO que
#                     sobrevive à reimportação — dirty tracking POR CAMPO, não por
#                     linha: "corrigi o telefone" não pode significar "também
#                     respondo pelo endereço" e congelar um endereço velho.
# `removido_em`     = a linha saiu do plano mas tinha edição humana. Soft, porque
#                     apagar levaria junto o trabalho sem deixar rastro na tela.
class CreateRomaneioLinhas < ActiveRecord::Migration[7.1]
  def change
    create_table :romaneio_linhas do |t|
      t.references :romaneio, null: false, foreign_key: true
      t.string  :veiculo,     null: false
      t.integer :ordem,       null: false, default: 0
      t.string  :chave_origem, null: false

      t.string  :nota_fiscal, null: false, default: ''
      t.string  :nome,        null: false, default: ''
      t.text    :endereco,    null: false, default: ''
      t.string  :aparelho,    null: false, default: ''   # 'SIM' ou ''
      t.string  :telefones,   null: false, default: ''

      t.jsonb   :origem,          null: false, default: {}
      t.jsonb   :campos_editados, null: false, default: []
      t.datetime :removido_em

      t.timestamps
    end

    add_index :romaneio_linhas, %i[romaneio_id chave_origem],
              unique: true, name: 'idx_romaneio_linha_chave_unico'
    add_index :romaneio_linhas, %i[romaneio_id veiculo ordem],
              name: 'idx_romaneio_linha_ordem'
  end
end
