module Patrimonio
class LotesDoLeilaoController < ApplicationController
  include ControllerConcern
  before_action :authenticate_usuario!
  before_action :autoriza_usuario!
  before_action :set_lote, only: [:show, :edit, :update, :destroy, :edit_bens_do_lote, :update_bens_do_lote,
                                  :fracassar_lote_leilao, :homologar_lote_leilao, :voltar_para_aberto_lote_leilao,
                                  :busca_bens_do_lote_leilao, :adiciona_bens_do_lote_leilao]
  before_action :set_dependencias, only: [:new, :edit]
  before_action :set_dependencias_busca_avancada, only: [:busca_bens_do_lote_leilao, :adiciona_bens_do_lote_leilao]

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

  # GET /patrimonio/leiloes/1
  def show
  end

  # GET /patrimonio/leiloes/new
  def new
    @patrimonio_lote = LoteDoLeilao.new(leilao_id: params[:leilao_id])
    @patrimonio_lote.save!
    redirect_to @patrimonio_lote
  end

  # GET /patrimonio/leiloes/1/edit
  def edit
    unless @patrimonio_lote.valores_dos_lotes_do_leilao.definido.present?
      @patrimonio_lote.valores_dos_lotes_do_leilao.build(tipo_de_valor: :valor_definido)
    end

    unless @patrimonio_lote.valores_dos_lotes_do_leilao.da_venda.present?
      @patrimonio_lote.valores_dos_lotes_do_leilao.build(tipo_de_valor: :valor_venda)
    end
  end

  # GET /patrimonio/leiloes/1/edit_bens_do_lote
  def edit_bens_do_lote
    @patrimonio_lote.bens_dos_lotes_do_leilao.build if @patrimonio_lote.bens_dos_lotes_do_leilao.empty?
    # @bens_patrimoniais_disponiveis = BemPatrimonial.disponiveis.where(unidade_gestora_id: @patrimonio_lote.leilao.unidades_gestoras_do_leilao.pluck(:unidade_gestora_id))
    @bens_patrimoniais_disponiveis = @patrimonio_lote.bens_patrimoniais
  end

  # POST /patrimonio/leiloes
  def create
    @patrimonio_lote = LoteDoLeilao.new(lote_params)

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

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

    # PATCH/PUT /patrimonio/leiloes/1/update_bens_do_lote
  def update_bens_do_lote
    if @patrimonio_lote.update( lote_params )
      redirect_to @patrimonio_lote, notice: 'Leilao foi atualizado(a) com sucesso.'
    else
      # @bens_patrimoniais_disponiveis = BemPatrimonial.disponiveis.where(unidade_gestora_id: @patrimonio_lote.leilao.unidades_gestoras_do_leilao.pluck(:unidade_gestora_id))
      @bens_patrimoniais_disponiveis = @patrimonio_lote.bens_patrimoniais
      render :edit
    end
  end

  # DELETE /patrimonio/leiloes/1
  def destroy
    leilao = @patrimonio_lote.leilao
    mensagem = apaga_e_retorna_mensagem(@patrimonio_lote)
    redirect_to leilao, mensagem
  end

  def fracassar_lote_leilao
    if @patrimonio_lote.fracassar_lote!
      redirect_to @patrimonio_lote, notice: "O #{@patrimonio_lote.ordem_lote}º Lote foi marcado como fracassado."
    else
      redirect_to @patrimonio_lote, notice: "Não foi possível fracassar o #{@patrimonio_lote.ordem_lote}º Lote."
    end
  end

  def homologar_lote_leilao
    if @patrimonio_lote.homologar_lote!
      redirect_to @patrimonio_lote, notice: "#{@patrimonio_lote.ordem_lote}º Lote foi homologado com sucesso."
    else
      render :homologar_lote_leilao
    end
  end

  def voltar_para_aberto_lote_leilao
    if @patrimonio_lote.voltar_para_aberto!
      redirect_to @patrimonio_lote, notice: "O #{@patrimonio_lote.ordem_lote}º Lote foi marcado como aberto."
    else
      redirect_to @patrimonio_lote, notice: "Não foi possível voltar o #{@patrimonio_lote.ordem_lote}º Lote para aberto."
    end
  end

  def busca_bens_do_lote_leilao
    @q = Patrimonio::BemPatrimonial.disponiveis.where(unidade_gestora_id: @patrimonio_lote.leilao.unidades_gestoras_do_leilao.pluck(:unidade_gestora_id)).search(params[:q])
    @bens = params[:q].try(:values).try(:delete_if, &:empty?).try(:present?) ? @q.result(distinct: false) : []
    if @bens.size > 100
      @qtd_removida = @bens.size - 100
      @bens = @bens.limit(100)
    end
  end

  def adiciona_bens_do_lote_leilao
    if params[:itens] && params[:itens].size > 0
      quantidade = @patrimonio_lote.adiciona_bens_do_lote(params[:itens])
      flash.now[:notice] = quantidade > 1 ? "#{quantidade} bens adicionados com sucesso" : "#{quantidade} bem adicionado com sucesso"
      @bens_patrimoniais_disponiveis = BemPatrimonial.disponiveis.where(unidade_gestora_id: @patrimonio_lote.leilao.unidades_gestoras_do_leilao.pluck(:unidade_gestora_id))
      @patrimonio_lote.save!
      render :edit_bens_do_lote
    else
      redirect_to patrimonio_busca_bens_do_lote_leilao_path(@patrimonio_lote), alert: "Nenhum item foi selecionado."
    end
  end

  private
  def set_lote
    @patrimonio_lote = LoteDoLeilao.find( params[:id] )
  end

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

  def set_dependencias_busca_avancada
    @unidades_gestoras = Loa::UnidadeGestora.where(id: @patrimonio_lote.leilao.unidades_gestoras_do_leilao.pluck(:unidade_gestora_id))
    @centros_de_custos = Controladoria::CentroDeCusto.where(unidade_gestora_id: @unidades_gestoras.ids) rescue []
		@itens = Base::Item.joins(bens_patrimoniais: :unidade_gestora).where('patrimonio_bens_patrimoniais.unidade_gestora_id in (?)
			and patrimonio_bens_patrimoniais.status = 1', @unidades_gestoras.ids).distinct.order('id ASC') rescue []
  end

  # Permite apenas os parâmetros específicos
  def lote_params
    params.require(:patrimonio_lote_do_leilao).permit(:id, :leilao_id, :status, :ordem_lote,
    :_destroy, bens_dos_lotes_do_leilao_attributes: [:id, :bem_patrimonial_id, :lote_do_leilao_id, :_destroy],
    valores_dos_lotes_do_leilao_attributes: [:id, :lote_do_leilao_id, :tipo_de_valor, :comissao_id, :valor_do_lote, :data_do_valor])
  end
end
end
