module Contabilidade
  class GrupoDeEventosContabeisController < ApplicationController
    include ContabilidadeControllerConcern
    include ControllerConcern
    before_action :authenticate_usuario!
    before_action :autoriza_usuario!
    before_action :set_grupo_de_evento_contabil, only: %i[show edit update destroy]
    before_action :disponibiliza_dependencias, only: %i[new create edit update]

    def index
      @q = Contabilidade::GrupoDeEventoContabil.joins(:eventos_contabeis).where(
        contabilidade_eventos_contabeis: { orcamento_id: contexto_atual.id }
      ).distinct.search(params[:q])

      @grupos_de_eventos_contabeis = @q.result(distinct: true).paginate(page: params[:page], per_page: 10)
    end

    def new
      @grupo_de_evento_contabil = Contabilidade::GrupoDeEventoContabil.new
    end

    def create
      atributos_do_grupo = grupo_de_evento_contabil_params

      atributos_do_grupo[:categoria_de_lancamento] = atributos_do_grupo[:categoria_de_lancamento]&.to_i rescue nil
      atributos_do_grupo[:titulo] = atributos_do_grupo[:titulo]&.to_i rescue nil
      atributos_do_grupo[:categoria_de_lancamento] = atributos_do_grupo[:categoria_de_lancamento]&.to_i rescue nil
      atributos_do_grupo[:lancamento_manual] = atributos_do_grupo[:lancamento_manual]&.to_i rescue nil
      atributos_do_grupo[:grupo_de_eventos_contabeis_ids] = params[:grupo_de_eventos_contabeis_ids] rescue nil

      @grupo_de_evento_contabil = Contabilidade::GrupoDeEventoContabil.new(atributos_do_grupo)

      if @grupo_de_evento_contabil.save
        redirect_to @grupo_de_evento_contabil, notice: 'Criado com sucesso'
      else
        @grupos_de_eventos_contabeis = Contabilidade::GrupoDeEventoContabil.joins(:eventos_contabeis).where(
          contabilidade_eventos_contabeis: { orcamento_id: contexto_atual.id }
        )
        render :new
      end
    end

    def edit
    end

    def update
      if @grupo_de_evento_contabil.update(atributos_do_grupo)
        redirect_to @grupo_de_evento_contabil, notice: 'Atualizado com sucesso'
      else
        render :edit
      end
    end

    def destroy
    end

    private

    def atributos_do_grupo
      atributos_do_grupo = grupo_de_evento_contabil_params
      atributos_dos_eventos = params["contabilidade_grupo_de_evento_contabil"]["eventos_contabeis_attributes"] rescue {}

      atributos_do_grupo[:categoria_de_lancamento] = atributos_do_grupo[:categoria_de_lancamento]&.to_i rescue nil if atributos_do_grupo[:categoria_de_lancamento]&.to_i > 0
      atributos_do_grupo[:titulo] = atributos_do_grupo[:titulo]&.to_i rescue nil if atributos_do_grupo[:titulo]&.to_i > 0
      atributos_do_grupo[:categoria_de_lancamento] = atributos_do_grupo[:categoria_de_lancamento]&.to_i rescue nil if atributos_do_grupo[:categoria_de_lancamento]&.to_i  > 0
      atributos_do_grupo[:lancamento_manual] = atributos_do_grupo[:lancamento_manual]&.to_i rescue nil if atributos_do_grupo[:lancamento_manual]&.to_i > 0

      atributos_do_grupo[:grupo_de_eventos_contabeis_ids] = params[:grupo_de_eventos_contabeis_ids] rescue nil
      atributos_do_grupo[:eventos_ids_para_inserir] = atributos_dos_eventos.keys.map { |key| atributos_dos_eventos[key]["id"] if atributos_dos_eventos[key]["_destroy"] == "false" }.compact
      atributos_do_grupo[:eventos_ids_para_remover] = atributos_dos_eventos.keys.map { |key| atributos_dos_eventos[key]["id"] if atributos_dos_eventos[key]["_destroy"] == "1" }.compact

      atributos_do_grupo.delete("eventos_contabeis_attributes")
      atributos_do_grupo
    end

    def disponibiliza_dependencias
      @grupos_de_eventos_contabeis = Contabilidade::GrupoDeEventoContabil.joins(:eventos_contabeis).where(
        contabilidade_eventos_contabeis: { orcamento_id: contexto_atual.id }
      ).distinct
    end

    def set_grupo_de_evento_contabil
      @grupo_de_evento_contabil = Contabilidade::GrupoDeEventoContabil.find(params[:id])
    end

    def grupo_de_evento_contabil_params
      params.require(:contabilidade_grupo_de_evento_contabil).permit(
        :nome_do_grupo, :categoria_de_lancamento, :titulo, :lancamento_manual, :transferir_grupos, :grupo_pcasp,
        eventos_contabeis_attributes: [
          :grupo_de_evento_contabil_id
        ]
      )
    end
  end
end
