require_relative "records_demonstration"
require_relative "verifies_call/finds_verifiable_calls"
require_relative "verifies_call/raises_verification_error"

module Mocktail
  class VerifiesCall
    extend T::Sig

    def initialize
      @records_demonstration = RecordsDemonstration.new
      @finds_verifiable_calls = FindsVerifiableCalls.new
      @raises_verification_error = RaisesVerificationError.new
    end

    def verify(demo, demo_config)
      recording = @records_demonstration.record(demo, demo_config)
      verifiable_calls = @finds_verifiable_calls.find(recording, demo_config)

      unless verification_satisfied?(verifiable_calls.size, demo_config)
        @raises_verification_error.raise(recording, verifiable_calls, demo_config)
      end
      nil
    end

    private

    def verification_satisfied?(verifiable_call_count, demo_config)
      (demo_config.times.nil? && verifiable_call_count > 0) ||
        (demo_config.times == verifiable_call_count)
    end
  end
end