#!/usr/bin/ruby

require 'table_print'
require 'thor'
require 'debci/user'
require 'debci/experiment'

module Debci
  class ExperimentCLI < Thor
    desc 'create FILE', 'Create experiment from FILE'
    option :start, alias: '-s', type: :boolean, desc: 'Immediately start experiment'
    def create(file)
      data = YAML.load_file(file)
      username = ENV['USER'] || 'nobody'
      owner = Debci::User.find_or_create_by!(username: username)
      experiment = Debci::Experiment.create!(owner: owner, **data)
      printf "Experiment #%d created\n", experiment.id

      return unless options[:start]

      experiment.start
      printf "Experiment #%d started\n", experiment.id
    end

    desc 'list', 'Lists recent experiments'
    option :all, aliases: '-a', type: :boolean, desc: 'List all experiments'
    option :limit, aliases: '-l', type: :numeric, default: 10, desc: 'Number of items to list'
    def list
      experiments = Debci::Experiment.order('id DESC')
      experiments = experiments.limit(options[:limit]) unless options[:all]
      tp experiments, :id, :title
    end

    desc 'start ID', 'start experiment with given ID'
    def start(id)
      experiment = Debci::Experiment.find(id)
      experiment.start
      printf "Experiment #%d started\n", experiment.id
    end

    desc 'results ID', 'display the results of experiment #ID'
    option :regressions, aliases: '-r', type: :boolean, desc: 'List only regressions'
    def results(id)
      experiment = Debci::Experiment.find(id)
      tests = experiment.tests.includes(control_job: [:package], test_job: [])
      if options[:regressions]
        tests = tests.where(
          control_job: { status: ['pass', 'neutral'] },
          test_job: { status: 'fail' }
        )
      end
      tp(
        tests,
        { package: { display_method: ->(t) { t.control_job.package.name } } },
        { control: { display_method: ->(t) { t.control_job.status } } },
        { test:    { display_method: ->(t) { t.test_job.status } } },
      )
    end
  end
end

Debci::ExperimentCLI.start
