module Obra
class OrdensDeServicoController < ApplicationController
	include ControllerConcern
	include Contabilidade::ObrasHelper
	include ObraControllersConcern

	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:contratos, :empenhos_do_contrato, :obter_obras_ou_servicos, :obter_dados_da_obra]
	before_action :set_ordem_de_servico, only: [:show, :edit, :update, :destroy]
	before_action :disponibiliza_dependencias, only: [:new, :edit]

	# GET /obra/ordens_de_servico
	def index
		@q = OrdemDeServico.order(:id).search(params[:q])
		@ordens_de_servico = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
	end

	# GET /obra/ordens_de_servico/1
	def show
	end

	# GET /obra/ordens_de_servico/new
	def new
		if params[:obra_id].present?
			@obra = Contabilidade::Obra.find(params[:obra_id])
			@ordem_de_servico = Obra::OrdemDeServico.new(obra_id: @obra.try(:id), cadastro_direto_na_obra: true)
		else
			@ordem_de_servico = Obra::OrdemDeServico.new
		end
	end

	# GET /obra/ordens_de_servico/1/edit
	def edit
	end

	# POST /obra/ordens_de_servico
	def create
		@ordem_de_servico = Obra::OrdemDeServico.new(ordem_de_servico_params)
		marca_nulo_data_prevista_de_termino_ou_prazo_de_execucao

		if params[:obra_id].present?
			@obra = Contabilidade::Obra.find(params[:obra_id])
			@ordem_de_servico = @obra.ordens_de_servico.new(ordem_de_servico_params)
		else
			@ordem_de_servico = Obra::OrdemDeServico.new(ordem_de_servico_params)
		end

		if @ordem_de_servico.save
			redirect_to rota_ordem_de_servico(@ordem_de_servico), notice: 'Ordem de servico foi criado(a) com sucesso.'
		else
			disponibiliza_dependencias
			render :new
		end
	end

	# PATCH/PUT /obra/ordens_de_servico/1
	def update
		marca_nulo_data_prevista_de_termino_ou_prazo_de_execucao
		if @ordem_de_servico.update( ordem_de_servico_params )
			redirect_to rota_ordem_de_servico(@ordem_de_servico), notice: 'Ordem de servico foi atualizado(a) com sucesso.'
		else
			disponibiliza_dependencias
			render :edit
		end
	end

	# DELETE /obra/ordens_de_servico/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@ordem_de_servico)
		if params[:obra_id].present?
			redirect_to rota_obra(@ordem_de_servico.obra), mensagem
		else
			redirect_to rota_ordens_de_servico, mensagem
		end
	end

	def contratos
		render json: Contabilidade::Obra.find(params[:obra_id]).contratos, methods: :numero_e_contratado
	end

	def empenhos_do_contrato
		render json: Licitacao::Contrato.find(params[:contrato_id]).empenhos.confirmados
	end

	def obter_dados_da_obra
		obra = Contabilidade::Obra.find(params[:obra_id])
		render json: { obra: obra, inicio: obra.data_de_inicio, termino: obra.data_prevista_de_termino, prazo: (obra.data_prevista_de_termino - obra.data_de_inicio ).to_i , methods: [obra.engenheiro_responsavel.present?, obra.descricao_da_obra]}
	end


	#POST AJAX
	def obter_obras_ou_servicos
		if params[:tipo] == 'obra'
			@pesquisa = contexto_atual.obras.obra.map { |o| [o.id, o.descricao_da_obra] }
		else
			@pesquisa = contexto_atual.obras.servico.map { |o| [o.id, o.descricao_da_obra] }
		end

		render json: { pesquisa: @pesquisa }
	end

	private
	def disponibiliza_dependencias
		@obras = contexto_atual.obras if params[:obra_id].nil?
		@contratos = []
		@empenhos = []
		if params[:id].present?
			ordem_de_servico = Obra::OrdemDeServico.find(params[:id])
			@contratos = ordem_de_servico.obra.contratos
			@empenhos = [ordem_de_servico.empenho] if ordem_de_servico.empenho.present?
		elsif params[:obra_id].present? || (@ordem_de_servico.present? && @ordem_de_servico.cadastro_direto_na_obra.present?)
			obra = Contabilidade::Obra.find_by(id: params[:obra_id] || @ordem_de_servico.obra_id)
			@contratos = obra.contratos rescue Array.new
			@empenhos = obra.empenhos rescue Array.new
		end
	end

	def marca_nulo_data_prevista_de_termino_ou_prazo_de_execucao
		if ordem_de_servico_params[:data_prevista_de_termino].blank?
			@ordem_de_servico.data_prevista_de_termino = nil
		else
			@ordem_de_servico.prazo_de_execucao = nil
		end
	end

	def set_ordem_de_servico
		@ordem_de_servico = OrdemDeServico.find( params[:id] )
	end

	# Permite apenas os parâmetros específicos
	def ordem_de_servico_params
		params.require(:obra_ordem_de_servico).permit(:codigo, :cadastro_direto_na_obra, :data_de_inicio, :data_prevista_de_termino, :obra_id, :contrato_id, :empenho_id, :historico, :data_da_ordem, :prazo_de_execucao)
	end
end
end
