class GestaoDeEstoque::EstoquesController < ApplicationController
  include ControllerConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario! , only:[:exibir_por_almoxarifado]
	before_action :set_estoque, only: [:show ,:estoque_especifico]
	before_action :disponibiliza_dependencias, only: [:index , :por_almoxarifado]
  before_action :disponibiliza_almoxarifados_e_unidades_orcamentarias, only: [:show]
  before_action :disponibiliza_dependencias_exibir_por_almoxarifado, only: [:exibir_por_almoxarifado]
	# GET /gestao_de_estoque/estoques
  def index
    modulo = session[:contexto_tipo]
    session[:tipo_do_estoque] = "index"
    if self.formats.include?(:json)
      @q = GestaoDeEstoque::Estoque.order("id DESC").limit(500).ransack(params[:q])
    else
      if configuracao.usa_modulo_administrativo?
        recebimento_de_materiais = GestaoDeEstoque::RecebimentoDeMaterial.where(avulso: false)
        movimentacoes_do_estoque = GestaoDeEstoque::MovimentacaoDoEstoque.left_joins(:estoque).where(origem_id: recebimento_de_materiais.ids)
      else
        recebimento_de_materiais = GestaoDeEstoque::RecebimentoDeMaterial.where(avulso: true)
        movimentacoes_do_estoque = GestaoDeEstoque::MovimentacaoDoEstoque.left_joins(:estoque).where(origem_id: recebimento_de_materiais.ids)
      end

      @q = GestaoDeEstoque::Estoque.where('orcamento_id = ? AND gestao_de_estoque_estoques.unidade_orcamentaria_id in (?)', 
        contexto_atual.id, current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id))
        .select("DISTINCT ON(item_id, unidade_de_medida_id) *").search(params[:q])

    end

    @estoques = @q.result(distinct: false).order('gestao_de_estoque_estoques.item_id').paginate(page: params[:page], per_page: 10)

    respond_to do |format|
      format.html
      format.json
    end
  end

	# GET /gestao_de_estoque/estoques/1
	def show
    @tipo_do_estoque = session[:tipo_do_estoque]
    @q = GestaoDeEstoque::Estoque.where(item_id: @estoque.item_id , unidade_de_medida_id: @estoque.unidade_de_medida_id, orcamento_id: contexto_atual.id).search(params[:q])
    estoques_ids = @q.result.ids
    @movimentacoes =  GestaoDeEstoque::MovimentacaoDoEstoque.where("origem_type is not null AND estoque_id in (?) AND extract(year from data_da_movimentacao) = ?", estoques_ids, contexto_atual.exercicio).search(params[:e]).result(distinct: false).paginate(page: params[:page], per_page: 10).order("created_at ASC")
    @entradas = @movimentacoes.where('origem_type is not null AND quantidade_entrada > 0 AND orcamento_id = ?', contexto_atual.id).search(params[:e]).result(distinct: false).paginate(page: params[:page], per_page: 10)
    @saidas = @movimentacoes.where('origem_type is not null AND quantidade_saida > 0 AND orcamento_id = ?', contexto_atual.id).search(params[:e]).result(distinct: false).paginate(page: params[:page], per_page: 10)
    @estoques = @q.result
  end

  def por_almoxarifado
    @q = GestaoDeEstoque::Estoque.joins(:almoxarifado).where("gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> 9 
      AND gestao_de_estoque_estoques.orcamento_id = ? and gestao_de_estoque_estoques.unidade_orcamentaria_id in (?)", 
      contexto_atual.id, current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id))
      .where.not(almoxarifado_id: nil , unidade_orcamentaria_id: nil).select("DISTINCT ON(almoxarifado_id , unidade_orcamentaria_id) *").search(params[:q])
    @estoques = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
  end

  def exibir_por_almoxarifado
    almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: params[:almoxarifado_id])
    @programa_por_escolas = almoxarifado.escola.programa_por_escolas if almoxarifado.escola.present?
    session[:tipo_do_estoque] = "por_almoxarifado"
    if almoxarifado.escola.present?
      @q = GestaoDeEstoque::Estoque.where(almoxarifado_id: almoxarifado.id , unidade_orcamentaria_id: params[:unidade_orcamentaria_id], programa_por_escola_id: @programa_por_escolas.ids).search(params[:q])
    else
      @q = GestaoDeEstoque::Estoque.where(almoxarifado_id: almoxarifado.id , unidade_orcamentaria_id: params[:unidade_orcamentaria_id]).search(params[:q])
    end
    
    @codigo = ""
    @estoques = @q.result(distinct: true).paginate(page: params[:page], per_page: 10)
  end

  def estoque_especifico
    @movimentacoes = GestaoDeEstoque::MovimentacaoDoEstoque.where("estoque_id = ? AND extract(year from data_da_movimentacao) = ?", @estoque.id, contexto_atual.exercicio).search(params[:e]).result(distinct: false).paginate(page: params[:page], per_page: 10)
    @entradas = @movimentacoes.where('quantidade_entrada > 0 AND orcamento_id = ?', contexto_atual.id).search(params[:e]).result(distinct: false).paginate(page: params[:page], per_page: 10)
    @saidas = @movimentacoes.where('quantidade_saida > 0 AND orcamento_id = ?', contexto_atual.id).search(params[:e]).result(distinct: false).paginate(page: params[:page], per_page: 10)
    render 'show'
  end

  def disponibiliza_dependencias_exibir_por_almoxarifado
    @almoxarifado = GestaoDeEstoque::Almoxarifado.find_by(id: params[:almoxarifado_id]).try(:codigo_e_nome)
    @unidade_orcamentaria = Loa::UnidadeOrcamentaria.find_by(id: params[:unidade_orcamentaria_id]).try(:codigo_e_nome)
    @unidades_de_medida = UnidadeDeMedida.order("id ASC")
    @tipos_de_materiais = GestaoDeEstoque::Estoque.tipos_de_materiais
  end

  def disponibiliza_almoxarifados_e_unidades_orcamentarias
    estoques = GestaoDeEstoque::Estoque.where(item_id: @estoque.item_id , unidade_de_medida_id: @estoque.unidade_de_medida_id)
    almoxarifados_ids = Array.new
    estoques.each do |estoque|
      almoxarifados_ids.push(estoque.almoxarifado_id)
    end
    @almoxarifados = GestaoDeEstoque::Almoxarifado.where(id: almoxarifados_ids)
    @unidades_orcamentarias = orcamento_atual.unidades_orcamentarias.order(:codigo)
  end

	private
	def set_estoque
		@estoque = GestaoDeEstoque::Estoque.find(params[:id])
	end

	def disponibiliza_dependencias
    unidades_orcamentarias_do_usuario_ids = current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)
    @tipos_de_materiais = GestaoDeEstoque::Estoque.tipos_de_materiais
    @tipos = [ ["Doação", 0], ["Devolução", 1], ["Ajuste de Inventário", 2], ["Aquisição", 3] ]
		@unidades_de_medida = UnidadeDeMedida.order("id ASC")
    if current_usuario.desenvolvedor?  
      @almoxarifados = GestaoDeEstoque::Almoxarifado.where("gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> ? AND orcamento_id = ?", GestaoDeEstoque::Almoxarifado.tipos_de_almoxarifados[:patrimonio], contexto_atual.id).order("id ASC")
      @unidades_orcamentarias = orcamento_atual.unidades_orcamentarias.order(:codigo)
    else
      @almoxarifados = GestaoDeEstoque::Almoxarifado.joins(:unidades_orcamentarias).where(
        loa_unidades_orcamentarias: {
          id: contexto_atual.unidades_orcamentarias.where(id: unidades_orcamentarias_do_usuario_ids)
        }
      ).where("gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> ? AND orcamento_id = ?", GestaoDeEstoque::Almoxarifado.tipos_de_almoxarifados[:patrimonio], contexto_atual.id).order("id ASC").uniq
      @unidades_orcamentarias = Loa::UnidadeOrcamentaria.joins(:orgao).where("loa_orgaos.orcamento_id = ?", contexto_atual.id).where(id: unidades_orcamentarias_do_usuario_ids).order(:codigo).uniq
    end
	end
end
