# frozen_string_literal: true

module Danger
  class Tailwind
    FRONTEND_INTERPOLATION_PATTERN = /gl-[0-9a-z-]+(\$\{|['"] ?\+)/
    BACKEND_INTERPOLATION_PATTERN = /gl-[0-9a-z-]+(#\{|['"] ?\+)/

    def initialize(helper, git)
      @helper = helper
      @git = git
    end

    def report_interpolated_utils
      frontend_files_with_interpolated_utils = files_with_interpolated_utils(
        frontend_tailwindy_files(@helper.all_changed_files), FRONTEND_INTERPOLATION_PATTERN)
      backend_files_with_interpolated_utils = files_with_interpolated_utils(
        backend_tailwindy_files(@helper.all_changed_files), BACKEND_INTERPOLATION_PATTERN)

      return "" if frontend_files_with_interpolated_utils.empty? && backend_files_with_interpolated_utils.empty?

      <<~MARKDOWN
      ### Interpolated utils

      The following files might contain interpolated utils:
      #{format_files_list(frontend_files_with_interpolated_utils + backend_files_with_interpolated_utils)}

      If you are leveraging CSS utilities, make sure they are written in full and not built via string
      interpolation as that would prevent Tailwind CSS from generating them.
      MARKDOWN
    end

    private

    def frontend_tailwindy_files(files)
      files.select do |file|
        file.end_with?('.vue', '.js')
      end
    end

    def backend_tailwindy_files(files)
      files.select do |file|
        file.end_with?('.html.haml', '.rb')
      end
    end

    def files_with_interpolated_utils(files, pattern)
      files.select do |file|
        diff = @git.diff_for_file(file)

        # When a file is just moved around it appears in the changed files list
        # but the diff is empty so we are skipping it.
        next if diff.nil?

        diff.patch.each_line.any? do |line|
          line.start_with?('+') && line.match?(pattern)
        end
      end
    end

    def format_files_list(files)
      files.map do |file|
        "- `#{file}`"
      end.join("\n")
    end
  end
end

danger_tailwind = Danger::Tailwind.new(helper, git)
report = danger_tailwind.report_interpolated_utils

unless report.empty?
  markdown <<~MSG
   ## Tailwind CSS

   #{report}
  MSG
end
