module Ci
  module API
    class Runners < Grape::API
      resource :runners do
        desc 'Delete a runner'
        params do
          requires :token, type: String, desc: 'The unique token of the runner'
        end
        delete "delete" do
          authenticate_runner!

          status(200)
          Ci::Runner.find_by_token(params[:token]).destroy
        end

        desc 'Register a new runner' do
          success Entities::Runner
        end
        params do
          requires :token, type: String, desc: 'The unique token of the runner'
          optional :description, type: String, desc: 'The description of the runner'
          optional :tag_list, type: Array[String], desc: 'A list of tags the runner should run for'
          optional :run_untagged, type: Boolean, desc: 'Flag if the runner should execute untagged jobs'
          optional :locked, type: Boolean, desc: 'Lock this runner for this specific project'
        end
        post "register" do
          runner_params = declared(params, include_missing: false).except(:token)

          runner =
            if runner_registration_token_valid?
              # Create shared runner. Requires admin access
              Ci::Runner.create(runner_params.merge(is_shared: true))
            elsif project = Project.find_by(runners_token: params[:token])
              # Create a specific runner for project.
              project.runners.create(runner_params)
            end

          return forbidden! unless runner

          if runner.id
            runner.update(get_runner_version_from_params)
            present runner, with: Entities::Runner
          else
            not_found!
          end
        end
      end
    end
  end
end
