# frozen_string_literal: true

# Admin::DocumentDataDictionariesController
#
# This controller manages the document data dictionaries within the admin namespace.
# It provides actions to list, show, edit, update, and destroy data dictionaries.
module Admin
  class DocumentDataDictionariesController < Admin::AdminController
    before_action :set_document
    before_action :set_document_data_dictionary, only: %i[show edit update destroy]

    # GET /document_data_dictionaries or /document_data_dictionaries.json
    def index
      @document_data_dictionaries = DocumentDataDictionary.all
      if params[:document_id]
        @document_data_dictionaries = DocumentDataDictionary.where(friendlier_id: @document.friendlier_id).order(position: :asc)
      else
        @pagy, @document_data_dictionaries = pagy(DocumentDataDictionary.all.order(friendlier_id: :asc, updated_at: :desc), items: 20)
      end
    end

    # GET /document_data_dictionaries/1 or /document_data_dictionaries/1.json
    def show
      @pagy, @document_data_dictionary_entries = pagy(@document_data_dictionary.document_data_dictionary_entries.order(position: :asc), items: 100)
    end

    # GET /document_data_dictionaries/new
    def new
      @document_data_dictionary = DocumentDataDictionary.new
    end

    # GET /document_data_dictionaries/1/edit
    def edit
    end

    # POST /document_data_dictionaries or /document_data_dictionaries.json
    def create
      @document_data_dictionary = DocumentDataDictionary.new(document_data_dictionary_params)

      respond_to do |format|
        if @document_data_dictionary.save
          format.html { redirect_to admin_document_document_data_dictionaries_path(@document), notice: "Document data dictionary was successfully created." }
          format.json { render :show, status: :created, location: @document_data_dictionary }
        else
          logger.debug("Document data dictionary could not be created. #{@document_data_dictionary.errors.full_messages}")
          format.html { render :new, status: :unprocessable_entity }
          format.json { render json: @document_data_dictionary.errors, status: :unprocessable_entity }
        end
      end
    end

    # PATCH/PUT /document_data_dictionaries/1 or /document_data_dictionaries/1.json
    def update
      respond_to do |format|
        if @document_data_dictionary.update(document_data_dictionary_params)
          format.html { redirect_to admin_document_document_data_dictionaries_path(@document), notice: "Document data dictionary was successfully updated." }
          format.json { render :show, status: :ok, location: @document_data_dictionary }
        else
          format.html { render :edit, status: :unprocessable_entity }
          format.json { render json: @document_data_dictionary.errors, status: :unprocessable_entity }
        end
      end
    end

    # DELETE /document_data_dictionaries/1 or /document_data_dictionaries/1.json
    def destroy
      @document_data_dictionary.destroy!

      respond_to do |format|
        format.html { redirect_to admin_document_document_data_dictionaries_path(@document), status: :see_other, notice: "Document data dictionary was successfully destroyed." }
        format.json { head :no_content }
      end
    end

    # DELETE /admin/document_data_dictionaries/destroy_all
    #
    # Destroys all document data dictionaries provided in the file parameter. If successful, redirects
    # with a success notice. Otherwise, redirects with an error notice.
    def destroy_all
      return if request.get?

      logger.debug("Destroy Data Dictionaries")
      unless params.dig(:document_data_dictionary, :data_dictionaries, :file)
        raise ArgumentError, "File does not exist or is invalid."
      end

      respond_to do |format|
        if DocumentDataDictionary.destroy_all(params.dig(:document_data_dictionary, :data_dictionaries, :file))
          format.html { redirect_to admin_document_document_data_dictionaries_path, notice: "Data dictionaries were destroyed." }
        else
          format.html { redirect_to admin_document_document_data_dictionaries_path, notice: "Data dictionaries could not be destroyed." }
        end
      rescue => e
        format.html { redirect_to admin_document_document_data_dictionaries_path, notice: "Data dictionaries could not be destroyed. #{e}" }
      end
    end

    private

    # Sets the document based on the document_id parameter.
    # If not nested, it does nothing.
    def set_document
      return unless params[:document_id] # If not nested

      @document = Document.includes(:leaf_representative).find_by!(friendlier_id: params[:document_id])
    end

    # Sets the document data dictionary based on the id parameter.
    def set_document_data_dictionary
      @document_data_dictionary = DocumentDataDictionary.find(params[:id])
    end

    # Only allow a list of trusted parameters through.
    def document_data_dictionary_params
      params.require(:document_data_dictionary).permit(
        :friendlier_id,
        :name,
        :description,
        :staff_notes,
        :tags,
        :csv_file,
        :position
      )
    end
  end
end