# frozen_string_literal: true

module RepositoryColumns
  class StatusColumnsController < RepositoryColumnsController
    include InputSanitizeHelper

    def create
      service = RepositoryColumns::CreateColumnService
                .call(user: current_user, repository: @repository, team: current_team,
                      column_type: Extends::REPOSITORY_DATA_TYPES[:RepositoryStatusValue],
                      params: repository_column_params)

      if service.succeed?
        render json: service.column, status: :created, creating: true
      else
        render json: service.errors, status: :unprocessable_entity
      end
    end

    def update
      service = RepositoryColumns::UpdateColumnService
                .call(user: current_user,
                      team: current_team,
                      column: @repository_column,
                      params: update_repository_column_params)

      if service.succeed?
        render json: service.column, status: :ok, editing: true
      else
        render json: service.errors, status: :unprocessable_entity
      end
    end

    def items
      column_status_items = @repository_column.repository_status_items
                                              .where('status ILIKE ?',
                                                     "%#{search_params[:query]}%")
                                              .select(:id, :icon, :status)

      render json: column_status_items
        .map { |i| { value: i.id, label: "#{i.icon} #{escape_input(i.status)}" } }, status: :ok
    end

    private

    def search_params
      params.permit(:query, :repository_id, :id)
    end

    def repository_column_params
      params.require(:repository_column).permit(:name, repository_status_items_attributes: %i(status icon))
    end

    def update_repository_column_params
      params.require(:repository_column).permit(:name, repository_status_items_attributes: %i(id status icon _destroy))
    end
  end
end