class Patrimonio::RequisicaoPatrimonial < ApplicationRecord
	has_paper_trail

	include TradutorConcern
	include IncrementadorDeCodigoConcern
	include AASM

	attr_default :status, :aberto

	attr_accessor :item_attribute
	attr_accessor :quantidade_disponivel_attribute
	attr_accessor :quantidade_solicitada_attribute

	belongs_to :unidade_gestora, class_name: 'Loa::UnidadeGestora'
	belongs_to :centro_de_custo, class_name: 'Controladoria::CentroDeCusto'
	belongs_to :responsavel, class_name: 'Controladoria::ResponsavelDoCentroDeCusto'
	belongs_to :orcamento, class_name: 'Orcamento'

	has_many :dados_dos_destinos_das_requisicoes, class_name: 'Patrimonio::DadosDoDestinoDaRequisicaoPatrimonial', dependent: :destroy
	has_many :itens_da_requisicao_patrimonial, class_name: 'Patrimonio::ItemDaRequisicaoPatrimonial', dependent: :destroy

	accepts_nested_attributes_for :dados_dos_destinos_das_requisicoes, reject_if: :all_blank, allow_destroy: true
	accepts_nested_attributes_for :itens_da_requisicao_patrimonial, allow_destroy: true

	validates_presence_of :data_da_requisicao, :unidade_gestora_id, :tipo

	scope :pendentes, -> { where('status = 1 OR status = 3 OR status = 4') }

	before_save :gera_numero_da_requisicao, if: Proc.new { new_record? || data_da_requisicao_changed? }
	before_save :remove_itens, if: Proc.new { self.itens_da_requisicao_patrimonial.size > 0 && tipo_changed? }

	enum tipo: { por_tombamento: 1, por_lote: 2, por_lote_e_tombamento: 3}
	enum status: { aberto: 1, confirmado: 2, enviado_ao_patrimonio: 3, recusado: 4, aguardando_documentos: 5}

	scope :tombamento_na_requisicao, -> (tombo) {
    joins(itens_da_requisicao_patrimonial: :bem_patrimonial)
		.left_joins(itens_da_requisicao_patrimonial: [bens_patrimoniais_da_requisicao: :bem_patrimonial])
		.where("LTRIM(patrimonio_bens_patrimoniais.numero_do_tombamento, '0') = ?", tombo.to_i.to_s)
  }

  def self.ransackable_scopes(auth_object = nil)
    [:tombamento_na_requisicao]
  end

	aasm column: :status, enum: true, whiny_transitions: false do
		state :aberto, :initial => true
		state :confirmado
		state :enviado_ao_patrimonio
		state :recusado
		state :aguardando_documentos
		
		event :enviar_requisicao_ao_patrimonio do
			transitions from: :aberto, to: :enviado_ao_patrimonio do
				guard do
					self.aberto? && self.contem_itens?
				end
			end
		end

		event :confirmar_requisicao do
			transitions from: [:aberto, :enviado_ao_patrimonio], to: :confirmado do
				guard do
					(self.aberto? || self.enviado_ao_patrimonio?) && self.contem_itens?
				end
				after do
					self.itens_da_requisicao_patrimonial.each do |item_da_requisicao|
						item_da_requisicao.atualiza_localizacao
					end
				end
			end
		end

		event :recusar_requisicao do
			transitions from: :enviado_ao_patrimonio, to: :recusado do
				guard do
					self.enviado_ao_patrimonio? && self.contem_itens?
				end
			end
		end

		event :retornar_requisicao_para_aberto do
			transitions from: [:confirmado, :recusado], to: :aberto do
				guard do 
					(self.confirmado? || self.recusado?)
				end
				after do
					self.voltar_etapa_de_itens_e_remover_dependencias if self.confirmado?
				end
			end
		end

		event :aguardar_documentos_da_requisicao_patrimonial do
			transitions from: :confirmado, to: :aguardando_documentos do
				guard do
					self.confirmado? && self.contem_itens?
				end
			end

			transitions from: :aguardando_documentos, to: :confirmado do
				guard do
					self.aguardando_documentos? && self.contem_itens?
				end
			end
		end

	end

	def gera_numero_da_requisicao
		gerar_codigo(data_da_requisicao, :codigo, :data_da_requisicao, :orcamento_id, self.orcamento_id)
	end

	def somente_um_destino?
		self.dados_dos_destinos_das_requisicoes.size == 1
	end

	def contem_itens?
    self.itens_da_requisicao_patrimonial.size > 0
  end

	def remove_itens
    ActiveRecord::Base.connection.execute("DELETE FROM patrimonio_itens_da_requisicao_patrimonial WHERE requisicao_patrimonial_id = #{self.id}")
	end

	def voltar_etapa_de_itens_e_remover_dependencias
    self.itens_da_transferencia.each do |item_da_transferencia|
      bem = Patrimonio::BemPatrimonial.find_by(id: item_da_transferencia.bem_patrimonial.id)
      localizacao = Patrimonio::LocalizacaoDoBem.where(bem_patrimonial: bem.id, centro_de_custo: item_da_transferencia.centro_de_custo.id).last
      responsavel = Patrimonio::ResponsavelDoBemPatrimonial.where(bem_patrimonial: bem.id).last
      localizacao.destroy unless localizacao.nil?
      responsavel.destroy unless responsavel.nil?

      ulti_local = Patrimonio::LocalizacaoDoBem.where(bem_patrimonial: bem.id).last
      bem.update_columns(unidade_gestora_id: self.unidade_gestora_origem.id, localizacao_atual_id: ulti_local.id)
    end
	end
	
end
