module GestaoDeEstoque
class AlmoxarifadosController < ApplicationController
	include ControllerConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:adicionar_escolas, :adicionar_todas_as_unidades_do_almoxarifado, :almoxarifados_por_unidades_orcamentarias, :retorna_almoxarifado_por_empenho]
	before_action :set_almoxarifado, only: [:show, :edit, :update, :destroy]
	before_action :disponibiliza_dependencias, only: [:index, :edit, :new, :update, :create]

	# GET /gestao_de_estoque/almoxarifados
	def index
		if self.formats.include?(:json)
			@q = GestaoDeEstoque::Almoxarifado.joins(:unidades_orcamentarias_do_almoxarifado)
				.where("gestao_de_estoque_almoxarifados.orcamento_id = ? AND gestao_de_estoque_unidades_orcamentarias_do_almoxarifado.unidade_orcamentaria_id in (?)", contexto_atual.id, current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id))
				.where("tipo_de_almoxarifado <> 9").order("id DESC").ransack(params[:q])
			@almoxarifados = @q.result
		else
			if params[:q].present? && params[:q][:agente_publico_municipal_id_eq].present?
				agente_publico_municipal_id = session[:agente_id].present? ? session[:agente_id] : params[:q][:agente_publico_municipal_id_eq]
				nome = Base::AgentePublicoMunicipal.find_by(id: agente_publico_municipal_id).cpf_e_nome
				ids = Array.new
				params[:q][:agente_publico_municipal_id_eq] = ""
			end

			@q = GestaoDeEstoque::Almoxarifado.joins(:unidades_orcamentarias_do_almoxarifado)
				.where("gestao_de_estoque_almoxarifados.orcamento_id = ? AND gestao_de_estoque_unidades_orcamentarias_do_almoxarifado.unidade_orcamentaria_id in (?)", contexto_atual.id, current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id))
				.where("tipo_de_almoxarifado <> 9").order(codigo: :asc).search(params[:q])

			if nome.present?
				almoxarifados_com_nome = @q.result(distinct: false)
				almoxarifados_com_nome.all.each_with_index do |almoxarifado , index|
					if almoxarifado.responsavel_atual.try(:agente_publico_municipal).try(:cpf_e_nome) == nome
						ids.push(almoxarifado.id)
					end
				end
				params[:q][:agente_publico_municipal_id_eq] = agente_publico_municipal_id
				@almoxarifados = almoxarifados_com_nome.where("gestao_de_estoque_almoxarifados.id in (?) " , ids).paginate(page: params[:page], per_page: 10)
			else
				@almoxarifados = @q.result(distinct: false).distinct.paginate(page: params[:page], per_page: 10)
			end
		end

		respond_to do |format|
			format.html
			format.json
		end
		@unidades_orcamentarias = contexto_atual.unidades_orcamentarias.order(:codigo, :nome)
	end

	# GET /gestao_de_estoque/almoxarifados/1
	def show
		@unidades_de_medida = UnidadeDeMedida.order("id ASC")

		@q = @almoxarifado.estoques.search(params[:q])
		@estoques = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)

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

	# GET /gestao_de_estoque/almoxarifados/new
	def new
		@almoxarifado = GestaoDeEstoque::Almoxarifado.new(orcamento_id: contexto_atual.id)
		adicionar_escolas
		adicionar_todas_as_unidades_do_almoxarifado

		@almoxarifado.responsaveis_dos_almoxarifados.build if @almoxarifado.responsaveis_dos_almoxarifados.empty?
	end

	# GET /gestao_de_estoque/almoxarifados/1/edit
	def edit
		adicionar_escolas
		adicionar_todas_as_unidades_do_almoxarifado
	end

	# POST /gestao_de_estoque/almoxarifados
	def create
		@almoxarifado = GestaoDeEstoque::Almoxarifado.new(almoxarifado_params)

		if @almoxarifado.tipo_de_almoxarifado == 'almoxarifado_central'
			@almoxarifado.unidades_orcamentarias_do_almoxarifado.each do |unidade|
				unidade.controle_de_estoque = true
			end
		end

		if @almoxarifado.save
			redirect_to @almoxarifado, notice: 'Almoxarifado foi criado(a) com sucesso.'
		else
			@almoxarifado.responsaveis_dos_almoxarifados.build if @almoxarifado.responsaveis_dos_almoxarifados.empty?
			render :new
		end
	end

	# PATCH/PUT /gestao_de_estoque/almoxarifados/1
	def update
		if @almoxarifado.update( almoxarifado_params )
			redirect_to @almoxarifado, notice: 'Almoxarifado foi atualizado(a) com sucesso.'
		else
			render :edit
		end
	end

	# DELETE /gestao_de_estoque/almoxarifados/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@almoxarifado)
		redirect_to gestao_de_estoque_almoxarifados_url, mensagem
	end

	def adicionar_escolas
		# @almoxarifado.escolas_por_almoxarifado.build if @almoxarifado.escolas_por_almoxarifado.empty?
		@escolas = GestaoDeEstoque::Escola.all
	end

	def adicionar_todas_as_unidades_do_almoxarifado
		if params[:todas].present? && params[:todas] == "true"
			unidades_orcamentarias_existentes = @almoxarifado.unidades_orcamentarias_do_almoxarifado.map(&:unidade_orcamentaria)
			unidades_orcamentarias_restantes = @unidades_orcamentarias - unidades_orcamentarias_existentes
			unidades_orcamentarias_restantes.each do |unidade_orcamentaria|
				@almoxarifado.unidades_orcamentarias_do_almoxarifado.build(unidade_orcamentaria: unidade_orcamentaria)
			end
		else
			@almoxarifado.unidades_orcamentarias_do_almoxarifado.build if @almoxarifado.unidades_orcamentarias_do_almoxarifado.empty?
		end
	end

	def almoxarifados_por_unidades_orcamentarias
		unidades_do_almoxarifado = GestaoDeEstoque::UnidadeOrcamentariaDoAlmoxarifado.joins(:almoxarifado)
			.where('gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> 9 and gestao_de_estoque_almoxarifados.orcamento_id = ? 
			and unidade_orcamentaria_id = ?', contexto_atual.id, params[:unidade_orcamentaria_id])

		@almoxarifados = GestaoDeEstoque::Almoxarifado.where(id: unidades_do_almoxarifado.pluck(:almoxarifado_id).uniq)
		respond_to do |format|
			format.json { render json: @almoxarifados, methods: :codigo_e_nome }
		end
	end

	def almoxarifados_por_unidades
		@almoxarifados = GestaoDeEstoque::UnidadeOrcamentariaDoAlmoxarifado.joins(:almoxarifado)
			.where('gestao_de_estoque_almoxarifados.tipo_de_almoxarifado <> 9 and gestao_de_estoque_almoxarifados.orcamento_id = ?
				and unidade_orcamentaria_id = ?', contexto_atual.id, params[:unidade_orcamentaria_id])

		respond_to do |format|
			format.json { render json: @almoxarifados, methods: :codigo_e_nome }
		end
	end

	def retorna_almoxarifado_por_empenho
		empenho = Contabilidade::Empenho.find_by(id: params[:empenho_id])
		unidades_orcamentarias_do_almoxarifado = GestaoDeEstoque::UnidadeOrcamentariaDoAlmoxarifado.where(unidade_orcamentaria_id: empenho.unidade_orcamentaria.id)
		@almoxarifados = GestaoDeEstoque::Almoxarifado.where('gestao_de_estoque_almoxarifados.orcamento_id = ? and gestao_de_estoque_almoxarifados.id in (?)', contexto_atual.id, unidades_orcamentarias_do_almoxarifado.all.pluck(:almoxarifado_id))
		respond_to do |format|
			format.json { render json: @almoxarifados, methods: :codigo_e_nome	}
		end
	end

	private
	def set_almoxarifado
		@almoxarifado = GestaoDeEstoque::Almoxarifado.find( params[:id] )
	end

	def disponibiliza_dependencias
		unidades_orcamentarias_contexto_atual = contexto_atual.unidades_orcamentarias.joins(:usuarios).where(id: current_usuario.unidades_orcamentarias_por_usuario.pluck(:unidade_orcamentaria_id)).uniq
		@estados = Base::Estado.all
		@almoxarifados = GestaoDeEstoque::Almoxarifado.where("tipo_de_almoxarifado <> 9").all
		@escolas = GestaoDeEstoque::Escola.all
		@tipos_de_almoxarifados = GestaoDeEstoque::Almoxarifado.tipos_de_almoxarifados
		@agentes_publicos_municipais = Base::AgentePublicoMunicipal.includes(:pessoa).where(unidade_orcamentaria_id: unidades_orcamentarias_contexto_atual.pluck(:id)).all.distinct
		@unidades_orcamentarias = []
		if @almoxarifado.present?
			@unidades_orcamentarias = @almoxarifado.unidades_orcamentarias + unidades_orcamentarias_contexto_atual
		else
			@unidades_orcamentarias = unidades_orcamentarias_contexto_atual
		end
	end

	# Permite apenas os parâmetros específicos
	def almoxarifado_params
		params.require(:gestao_de_estoque_almoxarifado).permit(
			:codigo, :nome, :email, :agente_publico_municipal_id, :almoxarifado_principal_id, :cep,
			:logradouro, :numero, :bairro, :complemento, :cidade_id, :tipo_de_almoxarifado, :farmaceutico_id,
			:orcamento_id, :escola_id, :contem_escola,
			unidades_orcamentarias_do_almoxarifado_attributes: [
				:id,
				:almoxarifado_id,
				:unidade_orcamentaria_id,
				:consumo_imediato,
				:controle_de_estoque,
				:_destroy
			],
			responsaveis_dos_almoxarifados_attributes: [
				:id, 
				:almoxarifado_id, 
				:agente_publico_municipal_id, 
				:data_de_entrada, 
				:data_de_saida, 
				:_destroy, 
				:data_da_portaria, 
				:numero_da_portaria
			]
			# escolas_por_almoxarifado_attributes: [
			# 	:id,
			# 	:almoxarifado_id,
			# 	:escola_id,
			# 	:_destroy
			# ],
		)
	end
end
end
