module LearnOpen
  class Opener
    attr_reader :editor,
                :target_lesson,
                :get_next_lesson,
                :io,
                :logger,
                :options

    def self.run(lesson:, editor_specified:, get_next_lesson:)
      new(lesson, editor_specified, get_next_lesson).run
    end

    def initialize(target_lesson, editor, get_next_lesson, options = {})
      @target_lesson = target_lesson
      @editor = editor
      @get_next_lesson = get_next_lesson

      @io = options.fetch(:io, LearnOpen.default_io)
      @logger = options.fetch(:logger, LearnOpen.logger)

      @options = options
    end

    def run
      logger.log('Getting lesson...')
      io.puts "Looking for lesson..."

      lesson_data = LearnOpen::Adapters::LearnWebAdapter
                        .new(options)
                        .fetch_lesson_data(
                            target_lesson: target_lesson,
                            fetch_next_lesson: get_next_lesson
                        )

      lesson = Lessons.classify(lesson_data, options)
      environment = LearnOpen::Environments.classify(options)
      lesson.open(environment, editor)
    end
  end
end