# frozen_string_literal: true

require 'json'

module PluginConfig
  class FileVerifier
    attr_reader :path

    def initialize(path)
      @path = path
    end

    def verify_written(expected_content)
      return { verified: false, details: "File not found: #{path}" } unless File.exist?(path)

      actual = File.read(path)
      if actual == expected_content
        { verified: true, details: 'Write verified: content matches' }
      else
        { verified: false, details: 'Write verification failed: content mismatch' }
      end
    rescue StandardError => e
      { verified: false, details: "Verification error: #{e.message}" }
    end

    def verify_key(section, key, expected_value)
      return { verified: false, details: "File not found: #{path}" } unless File.exist?(path)

      data = JSON.parse(File.read(path))
      container = data.dig(section)

      if container.nil?
        return { verified: false, details: "Section '#{section}' not found" }
      end

      if container.key?(key) && container[key] == expected_value
        { verified: true, details: "Key '#{key}' has expected value #{expected_value.inspect}" }
      else
        actual = container.key?(key) ? container[key].inspect : '(absent)'
        { verified: false, details: "Key '#{key}' expected #{expected_value.inspect}, got #{actual}" }
      end
    rescue JSON::ParserError => e
      { verified: false, details: "JSON parse error: #{e.message}" }
    rescue StandardError => e
      { verified: false, details: "Verification error: #{e.message}" }
    end

    def verify_key_absent(section, key)
      return { verified: false, details: "File not found: #{path}" } unless File.exist?(path)

      data = JSON.parse(File.read(path))
      container = data.dig(section)

      if container.nil? || !container.key?(key)
        { verified: true, details: "Key '#{key}' is absent from '#{section}'" }
      else
        { verified: false, details: "Key '#{key}' still present in '#{section}'" }
      end
    rescue JSON::ParserError => e
      { verified: false, details: "JSON parse error: #{e.message}" }
    rescue StandardError => e
      { verified: false, details: "Verification error: #{e.message}" }
    end
  end
end
