module Licitacao
	class SolucoesDoEtpController < ApplicationController
    include ControllerConcern
    include LicitacaoHelper
    before_action :authenticate_usuario!
    before_action :autoriza_usuario!, expect: [:atualizar_itens, :busca_itens]  
    before_action :set_etp, only: [:new, :create, :modelos, :edit, :destroy]
    before_action :set_solucoes_do_etps, except: %i[new create edit]
    before_action :disponibiliza_dependencias, only: [:create, :new, :update, :edit, :editar_itens]
    before_action :disponibiliza_dependencias_categorias, only: [:create, :new, :update, :edit]
    before_action only: [:atualizar_itens] do |controller|
      redirect_to @solucao_do_etp , alert: 'lista não pode ficar em branco. Alterações não foram salvas.' unless params[:licitacao_solucao_do_etp]
    end
    def index; end
    
    def new
      @solucoes_etp = @etp.solucoes_do_etp.new
    end
    # GET /licitacao/solucao_do_etp/1/busca_itens
    def busca_itens
      return if bloqueia_usuario_com_base_em 'editar_itens'
      disponibiliza_dependencias_busca_itens
      @q = Base::Item.where(esconder: false).where(categoria: @etp.categorias_dos_itens).where.not(id: @etp.itens_do_pedido.map(&:item_id)).search(params[:q])
      @itens = params[:q].try(:values).try(:delete_if, &:empty?).try(:present?) ? @q.result(distinct: false) : []
      if @itens.size > 100
        @qtd_removida = @itens.size - 100
        @itens = @itens.limit(100)
      end
    end
    
    def show; end
    
    def edit
      @solucoes_etp = Licitacao::SolucaoDoEtp.find(params[:id])
      disponibiliza_dependencias
    end
    
    def create
      @solucoes_etp = @etp.solucoes_do_etp.new(solucoes_do_etp_params)
      if @solucoes_etp.save
        if params[:ir_para_itens].present?
          redirect_path = { path: :editar_itens, id: @solucoes_do_etp.id }
        else
          redirect_path = licitacao_solucoes_do_etp_url(@solucoes_etp)
        end
        redirect_to redirect_path, notice: 'Solução do ETP criado com sucesso.'
      else
        render :new
      end
    end
    
    def update 
      if @solucao_do_etp.update(solucoes_do_etp_params)
        redirect_to licitacao_solucoes_do_etp_url(@solucao_do_etp), notice: 'Solução atualizada com sucesso.'
      else
        render :edit
      end
    end
    
    def atualizar_solucao_final
      if @solucao_do_etp.update(solucao_final: params[:esta_selecionado])
        render json: { message: 'Atualização bem-sucedida' }, status: :ok
      else
        render json: { error: 'Falha ao atualizar' }, status: :bad_request
      end
    end
    
    def destroy
      mensagem = apaga_e_retorna_mensagem(@solucao_do_etp)
      redirect_to @etp, mensagem
    end
    
    def disponibiliza_dependencias_categorias
      @categorias = Base::Categoria.principais.order(:codigo)
      @subcategorias = Base::Categoria.subcategorias
    end
    
    def disponibiliza_dependencias_itens
      @item = Base::Item.new
      @itens = Base::Item.where(categoria: @solucao_do_etp.categorias_dos_itens).limit(10)
      @unidade_de_medida = UnidadeDeMedida.all
      @tipos = Licitacao::ItemDoPedido.tipos
    end
    
    def editar_quantidades
      @action = params[:action]
      @solucao_do_etp.itens_da_solucao.build if @solucao_do_etp.itens_da_solucao.empty?
      @unidade_id = params[:unidade_id].present? ? params[:unidade_id].to_i : @solucao_do_etp.etp.unidade_orcamentaria_id
      @unidade_orcamentaria_convidada = @solucao_do_etp.unidades_orcamentarias_por_solucao_do_etp.find_by(unidade_orcamentaria_id: @unidade_id)
      
      @solucao_do_etp.cria_itens_da_solucao_do_etp_para_unidade @unidade_id
    end
    
    def remove_unidade_e_seus_itens
      @action = params[:action]
      return if bloqueia_usuario_com_base_em 'editar_quantidades'
      if @etp.solucoes_do_etp.remove_unidade_e_seus_itens(params[:etp_id])
        redirect_to licitacao_solucoes_do_etps_path(@solucao_do_etp, tab: "unidades_orcamentarias"), notice: 'Unidade desistida com sucesso.'
      else
        render :show, tab: "unidades_orcamentarias"
      end
    end
    # GET /licitacao/solucoes_do_etps/1/itens
    def editar_itens
      disponibiliza_dependencias_itens
      @solucao_do_etp.itens_da_solucao.build unless @solucao_do_etp.itens_da_solucao.present?
      @action = params[:action]
      @unidade_id = params[:unidade_id].present? ? params[:unidade_id].to_i : @solucao_do_etp.etp.unidade_orcamentaria_id
      @solucao_do_etp.cria_itens_da_solucao_do_etp_para_unidade @unidade_id
    end
    
    def atualizar_quantidades
      return if bloqueia_usuario_com_base_em 'editar_quantidades'
      
      if @solucao_do_etp.update( quantidade_params )
        
        redirect_to licitacao_solucoes_do_etp_url(@solucao_do_etp, tab: "unidades_orcamentarias"), notice: 'Pedido foi atualizado com sucesso.'
      else
        @action = params[:action]
        @unidade_id = params[:unidade_id].present? ? params[:unidade_id].to_i : @solucao_do_etp.etp.unidade_orcamentaria_id
        render :editar_quantidades, tab: "unidades_orcamentarias"
      end
    end
    
    def atualizar_itens
      return if bloqueia_usuario_com_base_em 'editar_itens'
      if @solucao_do_etp.verifica_acesso_do_usuario(current_usuario)
        if @solucao_do_etp.update(itens_params)
          if params[:continuar_editando].present?
            redirect_to editar_itens_licitacao_solucoes_do_etp_path(@solucao_do_etp), notice: 'Os Itens Cadastrados'
          else
            redirect_to licitacao_solucoes_do_etp_url(@solucao_do_etp), notice: 'Pedido foi atualizado com sucesso.'
          end 
        else
          @action = params[:action]
          @unidade_id = params[:unidade_id].present?  ? params[:unidade_id].to_i : @solucao_do_etp.etp.unidade_orcamentaria_id
          disponibiliza_dependencias_itens
          flash.now[:alert] = 'Não foi possível adicionar os itens a solução'
          render :editar_itens
        end
      else
        redirect_to @ept, notice: 'Você não tem autorização para editar os itens desse pedido'
      end
    end
    
    private
    
    def itens_params
      begin
        params.require(:licitacao_solucao_do_etp).permit(itens_da_solucao_attributes: [:preco_estimativo, :valor_unitario, :id , :marca, :item_id, :_destroy,
          itens_da_solucao_do_etp_por_unidade_orcamentaria_attributes: [:id, :quantidade, :unidade_orcamentaria_por_solucao_do_etp_id]])
      rescue ActionController::ParameterMissing
        nil
      end
    end
    
    def mensagem_complementacao_pedido
      if @solucao_do_etp.etp.unidade_orcamentaria_id != params[:unidade_id]
        @solucao_do_etp.cria_mensagem_complementacao_pedido(params[:unidade_id])
      end
    end
    
    def disponibiliza_dependencias
      @configuracao = Configuracao.last
      if current_usuario.tipo_de_poder == 'ambos'
        @orgaos = contexto_atual.orgaos_do_usuario(current_usuario).joins(:tipo_de_unidade_administrativa).where.not(base_tipos_de_unidades_administrativas: {codigo: '99'}).order( :codigo )
      else
        poder_usuario = current_usuario.tipo_de_poder == 'legislativo' ? 0 : 1
        @orgaos = contexto_atual.orgaos_do_usuario(current_usuario).joins(:tipo_de_unidade_administrativa).where(base_tipos_de_unidades_administrativas: {poder_associado: poder_usuario}).order( :codigo )
      end
      #@status = Licitacao::SolucoesDoEtp.status.except("cancelado").collect { |t| [ "#{t[0].humanize}", t[0] ] }
    end
    
    def disponibiliza_dependencias_busca_itens
      @categorias = @etp.solucoes_do_etp.categorias_dos_itens
    end
    
    def set_solucoes_do_etps
      @solucao_do_etp = Licitacao::SolucaoDoEtp.find(params[:id])
    end
    
    def disponibiliza_dependencias
      @solucoes_do_etp = Licitacao::SolucaoDoEtp.all
    end
    
    def set_etp
      @etp = Licitacao::Etp.find(params[:etp_id])
    end
    
    def solucoes_do_etp_params
      params.require(:licitacao_solucao_do_etp).permit(
        :descricao_da_solucao, :justificativa_parcelamento_contratacao, 
        :providencia_previa, :solucao_final, :etp_id, categorias_da_solucao_attributes: [ :id, :categoria_id, :subcategoria_id, :solucoes_do_etp_id, :_destroy ], 
        unidades_orcamentarias_por_solucao_do_etp_attributes: [ :unidade_orcamentaria_id, :solucao_do_etp_id, :etp_id ])
    end
    
    def quantidade_params
      begin
        params.require(:licitacao_solucao_do_etp).permit(itens_da_solucao_attributes: [:preco_estimativo,:id,
          itens_da_solucao_do_etp_por_unidade_orcamentaria_attributes: [:id, :quantidade, :unidade_orcamentaria_por_solucao_do_etp_id]
        ])
      rescue ActionController::ParameterMissing
        nil
      end
    end
  end
end