lib/lutaml/model/cli.rb



# frozen_string_literal: true

require "thor"
require "lutaml/model"

module Lutaml
  module Model
    # Command line interface for detecting duplicate records readable by Lutaml::Model
    class Cli < Thor
      #       desc "detect-duplicates PATH...",
      #            "Detect duplicate records readable by Lutaml::Model, files or directories"
      #       method_option :show_unchanged, type: :boolean, default: false,
      #                                      desc: "Show unchanged attributes in the diff output"
      #       method_option :highlight_diff, type: :boolean, default: false,
      #                                      desc: "Highlight only the differences"
      #       method_option :color, type: :string, enum: %w[auto on off], default: "auto",
      #                             desc: "Use colors in the diff output (auto, on, off)"

      #       def detect_duplicates(*paths)
      #         all_records = []
      #         paths.each do |path|
      #           if File.directory?(path)
      #             Dir.glob(File.join(path, "*.xml")).each do |file|
      #               process_file(file, all_records)
      #             end
      #           elsif File.file?(path) && path.end_with?(".xml")
      #             process_file(path, all_records)
      #           else
      #             puts "Warning: Skipping invalid path: #{path}"
      #           end
      #         end

      #         # TODO: Change using URL to a configurable primary key entered by user
      #         records_by_url = {}
      #         all_records.each do |record|
      #           urls = record[:record].location.flat_map do |loc|
      #             loc.url.map(&:content)
      #           end.compact
      #           unless urls.any?
      #             puts "Warning: Record without URL found in file: #{record[:file]}"
      #             next
      #           end

      #           urls.each do |url|
      #             records_by_url[url] ||= []
      #             records_by_url[url] << record
      #           end
      #         end

      #         duplicate_count = 0
      #         records_by_url.each do |url, records|
      #           next unless records.size > 1

      #           duplicate_count += 1
      #           puts "Duplicate set ##{duplicate_count} found for URL: #{url}"
      #           records.combination(2).each_with_index do |(record1, record2), index|
      #             puts "  Comparison #{index + 1}:"
      #             puts "  File 1: #{record1[:file]}"
      #             puts "  File 2: #{record2[:file]}"
      #             print_differences(
      #               record1[:record],
      #               record2[:record],
      #               options[:show_unchanged],
      #               options[:highlight_diff],
      #               color_enabled?,
      #             )
      #             puts "\n"
      #           end
      #         end
      #       end

      #       private

      #       def process_file(file, all_records)
      #         xml_content = File.read(file)
      #         collection = Lutaml::Model.from_xml(xml_content)
      #         collection.mods.each do |record|
      #           all_records << { record: record, file: file }
      #         end
      #       end

      #       def print_differences(record1, record2, show_unchanged, highlight_diff,
      # use_colors)
      #         diff_score, diff_tree = Lutaml::Model.diff_with_score(
      #           record1,
      #           record2,
      #           show_unchanged: show_unchanged,
      #           highlight_diff: highlight_diff,
      #           use_colors: use_colors,
      #           indent: "  ",
      #         )
      #         similarity_percentage = (1 - diff_score) * 100

      #         puts "  Differences:"
      #         puts diff_tree
      #         puts "  Similarity score: #{similarity_percentage.round(2)}%"
      #       end

      #       def color_enabled?
      #         case options[:color]
      #         when "on"
      #           true
      #         when "off"
      #           false
      #         else
      #           supports_color?
      #         end
      #       end

      #       def supports_color?
      #         return false unless $stdout.tty?

      #         if /mswin|mingw|cygwin/.match?(RbConfig::CONFIG["host_os"])
      #           return true if ENV["ANSICON"]
      #           return true if ENV["ConEmuANSI"] == "ON"
      #           return true if ENV["TERM"] == "xterm"
      #         end

      #         return true if ENV["COLORTERM"]

      #         term = ENV.fetch("TERM", nil)
      #         return false if term.nil? || term.empty?

      #         color_terms = %w[ansi color console cygwin gnome konsole kterm
      #                          linux msys putty rxvt screen tmux vt100 xterm]

      #         color_terms.any? { |ct| term.include?(ct) }
      #       end
    end
  end
end