module Obra
class DiariosDeObraController < ApplicationController
	include ControllerConcern
	before_action :authenticate_usuario!
	before_action :autoriza_usuario!, except: [:componentes_da_operacao_de_credito, :editar_equipamentos, :atualizar_equipamentos, :editar_maos_de_obra, :atualizar_maos_de_obra, :editar_atividades, :atualizar_atividades, :editar_fotos,:atualizar_fotos]
	before_action :set_diario_de_obra, only: [:show, :edit, :update, :destroy, :editar_fotos, :atualizar_fotos, :editar_maos_de_obra, :atualizar_maos_de_obra, :editar_equipamentos, :atualizar_equipamentos, :editar_atividades, :atualizar_atividades]
	before_action :disponibiliza_dependencias, only: [:new, :edit]

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

	# GET /obra/diarios_de_obra/1
	def show
	end

	# GET /obra/diarios_de_obra/new
	def new
		@diario_de_obra = Obra::DiarioDeObra.new
	end

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

	# POST /obra/diarios_de_obra
	def create
		@diario_de_obra = Obra::DiarioDeObra.new(diario_de_obra_params)

		if @diario_de_obra.save
			redirect_to @diario_de_obra, notice: 'Diário de obra foi criado(a) com sucesso.'
		else
			disponibiliza_dependencias
			render :new
		end
	end

	# PATCH/PUT /obra/diarios_de_obra/1
	def update
		if @diario_de_obra.update( diario_de_obra_params )
			redirect_to @diario_de_obra, notice: 'Diário de obra foi atualizado(a) com sucesso.'
		else
			disponibiliza_dependencias
			render :edit
		end
	end

	# DELETE /obra/diarios_de_obra/1
	def destroy
		mensagem = apaga_e_retorna_mensagem(@diario_de_obra)
		redirect_to obra_diarios_de_obra_url, mensagem
	end

	# GET /obra/diarios_de_obra/1/editar_maos_de_obra
	def editar_maos_de_obra
		disponibiliza_dependencias_maos_de_obra
		@diario_de_obra.maos_de_obra_rdo.build if @diario_de_obra.maos_de_obra_rdo.empty?
	end

	# PATCH /obra/diarios_de_obra/1/atualizar_maos_de_obra
	def atualizar_maos_de_obra
		return if bloqueia_usuario_com_base_em 'update'
		if @diario_de_obra.update(maos_de_obra_rdo_params)
			redirect_to obra_diario_de_obra_path(@diario_de_obra) + "?tab=maos_de_obra", notice: 'Mãos de obra atualizadas com sucesso.'
		else
			disponibiliza_dependencias_maos_de_obra
			render :editar_maos_de_obra
		end
	end

	# GET /obra/diarios_de_obra/1/editar_equipamentos
	def editar_equipamentos
		disponibiliza_dependencias_equipamentos
		@diario_de_obra.equipamentos_rdo.build if @diario_de_obra.equipamentos_rdo.empty?
	end

	# PATCH /obra/diarios_de_obra/1/atualizar_equipamentos
	def atualizar_equipamentos
		return if bloqueia_usuario_com_base_em 'update'
		if @diario_de_obra.update(equipamentos_rdo_params)
			redirect_to obra_diario_de_obra_path(@diario_de_obra) + "?tab=equipamentos", notice: 'Equipamentos atualizados com sucesso.'
		else
			disponibiliza_dependencias_equipamentos
			render :editar_equipamentos
		end
	end

	# GET /obra/diarios_de_obra/1/editar_atividades
	def editar_atividades
		@diario_de_obra.atividades_rdo.build if @diario_de_obra.atividades_rdo.empty?
	end

	# PATCH /obra/diarios_de_obra/1/atualizar_atividades
	def atualizar_atividades
		return if bloqueia_usuario_com_base_em 'update'
		if @diario_de_obra.update(atividades_rdo_params)
			redirect_to obra_diario_de_obra_path(@diario_de_obra) + "?tab=atividades", notice: 'Atividades atualizadas com sucesso.'
		else
			render :editar_atividades
		end
	end

	# GET /obra/diarios_de_obra/1/editar_fotos
	def editar_fotos
		@diario_de_obra.fotos_do_diario_de_obra.build if @diario_de_obra.fotos_do_diario_de_obra.empty?
	end

	# PATCH /obra/diarios_de_obra/1/editar_fotos
	def atualizar_fotos
		return if bloqueia_usuario_com_base_em 'update'
		if @diario_de_obra.update(fotos_do_diario_params)
			redirect_to obra_diario_de_obra_path(@diario_de_obra) + "?tab=fotos_do_diario", notice: 'Fotos atualizadas com sucesso.'
		else
			render :editar_fotos
		end
	end

	private
	def disponibiliza_dependencias
		if params[:obra_id].present? || params[:obra_original].present?
			id_da_obra = params[:obra_id].present? ? params[:obra_id] : params[:obra_original]
			@obras = [ Contabilidade::Obra.find( id_da_obra ) ]
			@obra_original = id_da_obra
		else
			@obras = Contabilidade::Obra.joins(:situacoes_da_obra).merge(Contabilidade::SituacaoDaObra.iniciadas_e_nao_concluidas)
		end
		@engenheiros = []
		if @diario_de_obra.present? && @diario_de_obra.obra.present?
			@engenheiros = @diario_de_obra.obra.engenheiros_da_obra.where(tipo: :fiscal)
		end
	end

	def disponibiliza_dependencias_maos_de_obra
		@maos_de_obra = Obra::MaoDeObra.all
	end

	def disponibiliza_dependencias_equipamentos
		@equipamentos = Obra::Equipamento.all
	end

	def set_diario_de_obra
		@diario_de_obra = Obra::DiarioDeObra.find( params[:id] )
	end

	# Permite apenas os parâmetros específicos
	def diario_de_obra_params
		params.require(:obra_diario_de_obra).permit(:obra_id, :numero, :engenheiro_da_obra_id, :observacoes, :data_do_relatorio, :tempo_manha, :tempo_tarde, :tempo_noite, :condicao_manha, :condicao_tarde, :condicao_noite)
	end

	def maos_de_obra_rdo_params
		begin
			params.require(:obra_diario_de_obra).permit(maos_de_obra_rdo_attributes: [:id, :diario_de_obra_id, :mao_de_obra_id, :quantidade, :_destroy])
		rescue ActionController::ParameterMissing
			nil
		end
	end

	def equipamentos_rdo_params
		begin
			params.require(:obra_diario_de_obra).permit(equipamentos_rdo_attributes: [:id, :diario_de_obra_id, :equipamento_id, :quantidade, :_destroy])
		rescue ActionController::ParameterMissing
			nil
		end
	end

	def atividades_rdo_params
		begin
			params.require(:obra_diario_de_obra).permit(atividades_rdo_attributes: [:id, :diario_de_obra_id, :descricao, :status, :_destroy])
		rescue ActionController::ParameterMissing
			nil
		end
	end

	def fotos_do_diario_params
		begin
			params.require(:obra_diario_de_obra).permit(fotos_do_diario_de_obra_attributes: [:id, :diario_de_obra_id, :file, :descricao, :_destroy])
		rescue ActionController::ParameterMissing
			nil
		end
	end


end
end
