module Licitacao
  class EtpsController < ApplicationController
    include LicitacaoHelper 
    include ControllerConcern
    include LicitacoesContabilidadeControllersConcern
    before_action :authenticate_usuario!
    before_action :autoriza_usuario!
    before_action :set_etp, except: [:index, :new, :create]
    before_action :disponibiliza_dependencias, only: [:new, :create, :edit, :update, :editar_itens]
    before_action :set_impacto_medida, only: [:destroy_impacto_medida, :show]
    # GET /etps
    def index
      @unidades_orcamentarias = contexto_atual.unidades_orcamentarias
      @status = Licitacao::Etp.status
      disponibiliza_dependencias
      @q = Etp.order(:id).search(params[:q])
      @etps = @q.result(distinct: false).paginate(page: params[:page], per_page: 10)
    end
    # GET /etps/new
    def new
      @etp = Etp.new
      disponibiliza_dependencias
    end
    # GET /etps/1/edit
    def edit
			@licitacao_etp = Etp.find(params[:id])
      disponibiliza_dependencias
		end
    # POST /etps
    
    def create
      @etp = Licitacao::Etp.new(etp_params)
  
      if @etp.save
        @etp.acao_ids = etp_params[:acao_ids].reject(&:blank?)
        redirect_to @etp, notice: 'ETP criado com sucesso.'
      else
        disponibiliza_dependencias
        render :new
      end
    end
    # PATCH/PUT /etps/1
    
    def update
      if @etp.update(etp_params)
        redirect_to licitacao_etp_path(@etp), notice: 'Etp foi atualizado(a) com sucesso.'
      else
        render :edit
      end
    end
    
    def destroy
      @etp = Etp.find(params[:id])
      mensagem = apaga_e_retorna_mensagem(@etp)
      redirect_to licitacao_etps_path, mensagem
    end
    
    def confirmar
      @etp = Licitacao::Etp.find(params[:id])
      if @etp.update(status: 'fechado')
        redirect_to @etp, notice: 'ETP confirmado com sucesso.'
      else
        redirect_to @etp, alert: 'Erro ao confirmar o ETP.'
      end
    end
    
    def voltar_etapa
      @etp = Licitacao::Etp.find(params[:id])
      if @etp.update(status: 'em_estudo')
        redirect_to @etp, notice: 'ETP atualizado com sucesso.'
      else
        redirect_to @etp, alert: 'Erro ao confirmar o ETP.'
      end
    end 
    
    def editar_unidades_orcamentarias
      disponibiliza_dependencias_unidades_convidadas
        if params[:todas].present? && params[:todas] == "true"
          unidades_existentes = @etp.unidades_orcamentarias_por_etp.map(&:unidade_orcamentaria_id)
          @unidades_orcamentarias.where.not(id: unidades_existentes.compact).each do |unidade_orcamentaria|
            @etp.unidades_orcamentarias_por_etp.build(unidade_orcamentaria_id: unidade_orcamentaria.id) unless unidade_orcamentaria.ordenadores_de_despesa.empty?
          end
        else
          @etp.unidades_orcamentarias_por_etp.build if @etp.unidades_orcamentarias_por_etp.count <= 1
        end
    end
  
    def atualizar_unidades_orcamentarias
      return if bloqueia_usuario_com_base_em 'editar_unidades_orcamentarias'
        if @etp.update( unidades_orcamentarias_params )
          redirect_to licitacao_etp_path(@etp) + "?tab=unidades_orcamentarias", notice: 'Unidades do ETP foram atualizadas com sucesso.'
        else
          disponibiliza_dependencias_unidades_convidadas
          render :editar_unidades_orcamentarias
        end
    end
  
    def remove_unidade_e_seus_itens
      @action = params[:action]
      return if bloqueia_usuario_com_base_em 'editar_quantidades'
      if @etp.remove_unidade_e_seus_itens(params[:unidade_por_id])
        redirect_to licitacao_etp_path(@etp, tab: "unidades_orcamentarias"), notice: 'Unidade desistida com sucesso.'
      else
        render :show, tab: "unidades_orcamentarias"
      end
    end
    
    def impactos_medidas
      @etp = Licitacao::Etp.find(params[:id])
      @impacto = @etp.impactos_ambientais_do_etp.new(impacto: params[:impacto])
      @medida = @etp.medidas_mitigatoras_do_etp.new(medida: params[:medida])
    
      if @impacto.save && @medida.save
        respond_to do |format|
          format.html { redirect_to licitacao_etp_path(@etp), notice: 'Impacto e Medida criados com sucesso.' }
          format.js { render js: "window.location = '#{licitacao_etp_path(@etp)}'" } 
        end
      else
        respond_to do |format|
          format.html { redirect_to licitacao_etp_path(@etp), alert: 'Não foi possível criar Impacto e Medida.' }
          format.js { render js: "alert('Erro ao criar Impacto e Medida.');" }
        end
      end
    end
    
    def edit_impacto_medida
      @etp = Licitacao::Etp.find(params[:id])
      @impacto = @etp.impactos_ambientais_do_etp.find(params[:impacto_id])
      @medida = @etp.medidas_mitigatoras_do_etp.find(params[:medida_id])
      render partial: 'edit_impacto_modal', locals: { impacto: @impacto, medida: @medida }
    end
    
    def update_impacto_medida
      @etp = Licitacao::Etp.find(params[:etp_id])
      @impacto = @etp.impactos_ambientais_do_etp.find(params[:impacto_id])
      @medida = @etp.medidas_mitigatoras_do_etp.find(params[:medida_id])
      
      if @impacto.update(impacto_params) && @medida.update(medida_params)
        respond_to do |format|
          format.html { redirect_to licitacao_etp_path(@etp), notice: 'Impacto e Medida atualizados com sucesso.' }
        end
      else
        render partial: 'edit_impacto_modal', locals: { impacto: @impacto, medida: @medida }
      end
    end
  
    def destroy_impacto_medida
      @etp = Licitacao::Etp.find(params[:etp_id])
      @impacto = @etp.impactos_ambientais_do_etp.find(params[:impacto_id])
      @medida = @etp.medidas_mitigatoras_do_etp.find(params[:medida_id])
    
      if @impacto.destroy && @medida.destroy
        respond_to do |format|
          format.html { redirect_to licitacao_etp_path(@etp), notice: 'Impacto e Medida removidos com sucesso.' }
        end
      else
        redirect_to licitacao_etp_path(@etp), alert: 'Erro ao remover Impacto e Medida.'
      end
    end
    
    def editar_itens
      disponibiliza_dependencias_itens
      if @solucoes_etp.itens_da_solucao.empty?
        @solucoes_etp.itens_da_solucao.build
      end
      @action = params[:action]
      @unidade_id = params[:unidade_id].present? ? params[:unidade_id].to_i : @solucoes_do_etp.unidade_orcamentaria_id
      @solucoes_do_etp.cria_item_da_solucao_do_etp_para_unidade @unidade_id
    end

    def criar_pedido
      @etp = Etp.find(params[:id])
      solucao_final = @etp.solucoes_do_etp.find_by(solucao_final: true)

      @pedido = Licitacao::Pedido.new(
        unidade_orcamentaria_id: @etp.unidade_orcamentaria_id,
        objeto: solucao_final.descricao_da_solucao,
        justificativa: solucao_final.justificativa_parcelamento_contratacao,
        data_limite_para_complementacao: Date.today,
        vigencia: "Precisa ser Preenchido",
        data_do_pedido: Date.today,
        local_de_entrega: "Precisa ser Preenchido",
        prazo_de_entrega: "Precisa ser Preenchido",
        etp_id: @etp.id
      )
      
      if @etp.unidades_orcamentarias_por_etp.count > 1 
        @pedido.convidar_unidades = true
      end
      
      @pedido.usuario = current_usuario
      @pedido.orcamento = contexto_atual
      
      unidades_orcamentarias = @etp.unidades_orcamentarias_por_etp.map(&:unidade_orcamentaria)
    
      unidades_orcamentarias.each do |unidade|
        @pedido.unidades_orcamentarias_por_pedido.build(unidade_orcamentaria: unidade)
      end

      solucao_final.itens_da_solucao.each do |item|
        @pedido.itens_do_pedido.build(
          item_id: item.item_id,
          preco_estimativo: item.preco_estimativo,
        )
      end
      
      if @pedido.save
        redirect_to licitacao_pedido_path(@pedido), notice: "Pedido criado com sucesso!"
      else
        redirect_to licitacao_etp_path(@etp),  notice: "Erro ao criar pedidos!"
      end
  
    end
  
    
    private
    
    def set_etp
      if params[:etp_id].present?
        @etp = Licitacao::Etp.find(params[:etp_id])
      else  
        @etp = Licitacao::Etp.find(params[:id])
      end  
    end
    
    def set_impacto_medida
      @impacto = Licitacao::ImpactoAmbientalDoEtp.find_by(etp_id: params[:id])
      @medida = Licitacao::MedidaMitigadoraDoEtp.find_by(etp_id: params[:id])
    end
    
    
    def disponibiliza_dependencias_unidades_convidadas
      configuracao = Configuracao.last
      poder_associado = configuracao.camara_municipal? ? '0' : '1'
      @unidades_orcamentarias = contexto_atual.unidades_orcamentarias.joins(:tipo_de_unidade_administrativa).where.not(loa_unidades_orcamentarias: { id: @etp.unidade_orcamentaria_id }, base_tipos_de_unidades_administrativas: {codigo: '99'}).where(base_tipos_de_unidades_administrativas: {poder_associado: poder_associado})
    end
    
    def disponibiliza_dependencias
      @unidades_orcamentarias = contexto_atual.unidades_orcamentarias
			@agentes = Base::AgentePublicoMunicipal.all
			@acoes_pca = Pca::Acao.all
      
		end	
    
    def etp_params
			params.require(:licitacao_etp).permit(:data_estudo, :status, :unidade_orcamentaria_id, :responsavel_id, :data_previsao_contratacao, :pca_acoes, :acao_fora_gerencial, :objeto, :impactos_ambientais, :medidas_mitigadoras, :necessidade_da_contratacao,:acoes_numero_cont, :pode_convidar_unidades, acao_ids: [])
		end
  
    
    def impacto_params
      params.permit(:impacto) # Ajuste aqui
    end

    def pedido_params
      params.require(:licitacao_pedido).permit(
        :unidade_orcamentaria_id,
        :objeto,
        :justificativa,
        :status,
        :prazo_de_entrega,
        :local_de_entrega,
        :vigencia,
        :orcamento_id,
        :usuario_id
      )
    end
    
    
    def medida_params
      params.permit(:medida) # Ajuste aqui
    end
    
    def unidades_orcamentarias_params
      params.require(:licitacao_etp).permit(
        unidades_orcamentarias_por_etp_attributes: [
          :id,
          :unidade_orcamentaria_id,
          :_destroy
        ]
      )
    end 
  end  
end