module Patrimonio
class LeiloesController < ApplicationController
  include ControllerConcern
  before_action :authenticate_usuario!
  before_action :autoriza_usuario!
  before_action :set_leilao, only: [:show, :edit, :update, :destroy, :edit_unidades_gestoras_leilao, :update_unidades_gestoras_leilao,
                                    :confirmar_leilao, :voltar_etapa_leilao, :finalizar_leilao]
  before_action :set_dependencias, only: [:new, :edit]

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

  # GET /patrimonio/leiloes/1
  def show
    @lotes = @patrimonio_leilao.lotes_do_leilao.paginate(page: params[:page], per_page: 10)
  end

  # GET /patrimonio/leiloes/new
  def new
    @patrimonio_leilao = Leilao.new
  end

  # GET /patrimonio/leiloes/1/edit
  def edit
  end

  # POST /patrimonio/leiloes
  def create
    @patrimonio_leilao = Leilao.new(leilao_params)

    if @patrimonio_leilao.save
      redirect_to @patrimonio_leilao, notice: 'Leilao foi criado(a) com sucesso.'
    else
      set_dependencias
      render :new
    end
  end

  # GET /patrimonio/leiloes/1/edit_unidades_gestoras
  def edit_unidades_gestoras_leilao
    @unidades_gestoras = Loa::UnidadeGestora.where('data_encerramento IS NULL or data_encerramento >= ?', Date.today)
    @patrimonio_leilao.unidades_gestoras_do_leilao.build if @patrimonio_leilao.unidades_gestoras_do_leilao.empty?
  end

  # PATCH/PUT /patrimonio/leiloes/1
  def update
    if @patrimonio_leilao.update( leilao_params )
      redirect_to @patrimonio_leilao, notice: 'Leilao foi atualizado(a) com sucesso.'
    else
      render :edit
    end
  end

  # PATCH/PUT /patrimonio/leiloes/1/update_unidades_gestoras
  def update_unidades_gestoras_leilao
    if @patrimonio_leilao.update( leilao_params )
      redirect_to @patrimonio_leilao, notice: 'Leilao foi atualizado(a) com sucesso.'
    else
      @unidades_gestoras = Loa::UnidadeGestora.where('data_encerramento IS NULL or data_encerramento >= ?', Date.today)
      render :edit_unidades_gestoras_leilao
    end
  end

  # DELETE /patrimonio/leiloes/1
  def destroy
    mensagem = apaga_e_retorna_mensagem(@patrimonio_leilao)
    redirect_to patrimonio_leiloes_url, mensagem
  end

  def confirmar_leilao
    begin
      if @patrimonio_leilao.confirmar_leilao!
        redirect_to @patrimonio_leilao, notice: "Leilão confirmado com sucesso!"
      else
        redirect_to @patrimonio_leilao, notice: "Não foi possível confirmar o leilão."
      end
    rescue => exception
      mensagem = 'Não foi possível confirmar o leilão, verifique as informações.'  + exception.message
      redirect_to @patrimonio_leilao, notice: mensagem
      raise ActiveRecord::Rollback
    end
  end

  def finalizar_leilao
    begin
      if @patrimonio_leilao.finalizar_leilao!
        redirect_to @patrimonio_leilao, notice: "Leilão confirmado com sucesso!"
      else
        redirect_to @patrimonio_leilao, notice: "Não foi possível confirmar o leilão."
      end
    rescue => exception
      mensagem = 'Não foi possível finalizar o leilão, verifique as informações.'  + exception.message
      redirect_to @patrimonio_leilao, notice: mensagem
      raise ActiveRecord::Rollback
    end
  end

  def voltar_etapa_leilao
    if @patrimonio_leilao.voltar_etapa_do_leilao!
      redirect_to @patrimonio_leilao, notice: "Etapa retornada com sucesso!"
    else
      redirect_to @patrimonio_leilao, notice: "Não foi possível retornar a etapa."
    end
  end

  private
  def set_leilao
    @patrimonio_leilao = Leilao.find( params[:id] )
  end

  def set_dependencias
    @comissoes = Patrimonio::Comissao.where('data_fim IS NULL or data_fim >= ?', Date.today)
  end

  # Permite apenas os parâmetros específicos
  def leilao_params
    params.require(:patrimonio_leilao).permit(:numero_ato, :unidade_gestora_id, :comissao_id, :objeto, :orcamento_id,
    :numero_leilao, unidades_gestoras_do_leilao_attributes: [:id, :leilao_id, :unidade_gestora_id, :_destroy])
  end
end
end
