require "himekaminize/filters/base_filter"
module Himekaminize
  module Filters
    class TaskFilter < BaseFilter
      def call(context:, output:)
        seq = 0
        @context = context
        output = output.map do |line|
          if line.is_a?(String) && line =~ /\A\s*(#{Himekaminize::Nodes::Task::INCOMPLETE_PATTERN}|#{Himekaminize::Nodes::Task::COMPLETE_PATTERN})/
            seq += 1
            Himekaminize::Nodes::Task.new(line, seq)
          else
            line
          end
        end

        # Attach depth, and parent_seq
        output.map.with_index do |line, index|
          next line if !line.is_a?(Himekaminize::Nodes::Task) || index == 0 || line.none_parent?
          prev_i = index - 1
          next attach_parent_task(output, line, prev_i)
        end

        if only_task_list?
          output = output.select { |line| line.is_a?(Himekaminize::Nodes::Task) }
        end

        if update_task_status_list.present?
          seq = 1
          update_task_status_list.each do |v|
            output = output.map do |line|
              if line.is_a?(Himekaminize::Nodes::Task) && line.seq == v[:seq]
                line.update_status(v[:status].to_sym)
                line
              else
                line
              end
            end
          end

        end

        {
          context: context,
          output: output,
        }
      end

      private

      def only_task_list?
        @context[:only_task_list].presence || false
      end

      def update_task_status_list
        @context[:update_task_status_list].presence || {}
      end

      def attach_parent_task(output, task, prev_i)
        prev_i.downto(0) do |pi|
          unless output[pi].is_a?(Himekaminize::Nodes::Task)
            task.depth ||= 0
            return task
          end
          if task.parent?(output[pi])
            task.depth = output[pi].depth + 1
            task.parent_seq = output[pi].seq
            return task
          else
            task.depth ||= 0
          end
        end
        task
      end
    end
  end
end