class Licitacao::SolucaoDoEtp < ApplicationRecord
  include AASM
	include TradutorConcern
  include MensagemConcern
  
  has_paper_trail
  
  belongs_to :etp , class_name: 'Licitacao::Etp', required: true
  belongs_to :unidade_orcamentaria, class_name: 'Loa::UnidadeOrcamentaria'
  
  has_many :categorias_da_solucao, class_name: 'Licitacao::CategoriaDaSolucao', dependent: :destroy
  has_many :categorias, through: :categorias_da_solucao
  has_many :subcategorias, through: :categorias_da_solucao
  has_many :unidades_orcamentarias_por_solucao_do_etp, class_name: 'Licitacao::UnidadeOrcamentariaPorSolucaoDoEtp', dependent: :destroy
  has_many :itens_da_solucao, class_name: 'Licitacao::ItemDaSolucao', inverse_of: :solucao_do_etp, dependent: :destroy
  has_many :unidades_orcamentarias, :through => :unidades_orcamentarias_por_solucao_do_etp
  has_many :itens_da_solucao_do_etp_por_unidade_orcamentaria, through: :itens_da_solucao
  has_many :itens, through: :itens_da_solucao
  
  accepts_nested_attributes_for :itens_da_solucao, reject_if: :all_blank, allow_destroy: true
  accepts_nested_attributes_for :categorias_da_solucao, reject_if: :all_blank, allow_destroy: true
  accepts_nested_attributes_for :unidades_orcamentarias_por_solucao_do_etp, reject_if: :all_blank, allow_destroy: true
  
  validates :itens_da_solucao, uniq_nested_attributes: { atributo: :item_id, mensagem: "item deve ser único dentro de uma solução" }
  
  attr_default :solucao_final, false
  
  before_create :set_numero_sequencial
  after_create :criar_unidade_orcamentaria_convidada_por_etp
  
  self.table_name = 'licitacao_solucoes_do_etp'
  
  def criar_unidade_orcamentaria_convidada_por_etp
    unidades_convidada = Licitacao::UnidadeOrcamentariaPorEtp.where(etp_id: self.etp_id)
    
    unidades_convidada.each do |unidade_convidada|
      principal = unidade_convidada.unidade_orcamentaria_id == self.etp.unidade_orcamentaria.id ? true : false
      Licitacao::UnidadeOrcamentariaPorSolucaoDoEtp.create(
        etp_id: self.etp_id,
        solucao_do_etp_id: self.id,
        unidade_orcamentaria_id: unidade_convidada.unidade_orcamentaria_id,
        principal: principal
      )
    end
  end
  
  def categorias_dos_itens
		self.categorias_da_solucao.map(&:categoria_do_item).flatten
	end
  
  def set_numero_sequencial
    
    ultima_solucao = Licitacao::SolucaoDoEtp.where(etp_id: self.etp_id).order(:numero).last
    self.numero = ultima_solucao.present? ? ultima_solucao.numero + 1 : 1
  end
  
  def remove_unidade_e_seus_itens(unidade_por_etp_id)
		Licitacao::Etp.find(unidade_por_etp_id).destroy
	end
  
  def verifica_acesso_do_usuario usuario
    return true if usuario.desenvolvedor?
		unidades_por_usuario = usuario.unidades_orcamentarias_por_usuario
    unidades_por_usuario.pluck(:unidade_orcamentaria_id).select {|num| self.unidades_orcamentarias_por_solucao_do_etp.pluck(:unidade_orcamentaria_id).include?(num)}.any?
	end
  
  def cria_itens_da_solucao_do_etp_para_unidade unidade_orcamentaria_id
    unidade_orcamentaria_por_solucao = unidades_orcamentarias_por_solucao_do_etp.find_by_unidade_orcamentaria_id(unidade_orcamentaria_id)
    return nil unless unidade_orcamentaria_id.present? && unidade_orcamentaria_por_solucao.present?
    itens_da_solucao.each do |item|
      if item.itens_da_solucao_do_etp_por_unidade_orcamentaria.where(unidade_orcamentaria_por_solucao_do_etp_id: unidade_orcamentaria_por_solucao.id).empty?
        item.itens_da_solucao_do_etp_por_unidade_orcamentaria.build(unidade_orcamentaria_por_solucao_do_etp_id: unidade_orcamentaria_por_solucao.id)
      end
    end
  end
end