# frozen_string_literal: true

module ApiSignature
  class Validator
    attr_reader :timestamp

    def initialize(options)
      @options = options
      @timestamp = Time.zone.at(@options[:timestamp].to_i)
    end

    def valid?(signature, secret)
      return false if signature.blank? || secret.blank? || expired?
      generator.generate_signature(secret) == signature
    end

    def expired?
      !alive?
    end

    private

    def generator
      @generator ||= Generator.new(@options)
    end

    def alive?
      alive_timerange.cover?(timestamp)
    end

    def alive_timerange
      @alive_timerange ||= (ttl.ago..ttl.from_now)
    end

    def ttl
      ApiSignature.signature_ttl || TTL
    end
  end
end