# typed: true
# frozen_string_literal: true

module RuboCop
  module Cask
    module AST
      # This class wraps the AST method node that represents the cask header. It
      # includes various helper methods to aid cops in their analysis.
      class CaskHeader
        extend T::Sig

        def initialize(method_node)
          @method_node = method_node
        end

        attr_reader :method_node

        def dsl_version?
          hash_node
        end

        def header_str
          @header_str ||= source_range.source
        end

        def source_range
          @source_range ||= method_node.loc.expression
        end

        sig { returns(String) }
        def preferred_header_str
          "cask '#{cask_token}'"
        end

        def cask_token
          @cask_token ||= if dsl_version?
            pair_node.val_node.children.first
          else
            method_node.first_argument.str_content
          end
        end

        def hash_node
          @hash_node ||= method_node.each_child_node(:hash).first
        end

        def pair_node
          @pair_node ||= hash_node.each_child_node(:pair).first
        end
      end
    end
  end
end
