module Factor
  module Runtime
    class ServiceAddress < Array
      def initialize(service_ref)
        if service_ref.is_a?(String)
          service_map = service_ref.split('::')
          raise ArgumentError, 'Address must not be empty' if service_ref.empty?
          raise ArgumentError, 'Address must contain at least one value' unless service_map.count > 0
          raise ArgumentError, 'Address must contain at least one value' unless service_map.all?{|i| !i.empty?}
          super service_map
        elsif service_ref.is_a?(ServiceAddress) || service_ref.is_a?(Array)
          raise ArgumentError, 'All elements in array must be a string' unless service_ref.all?{|i| i.is_a?(String)}
          super service_ref
        else
          raise ArgumentError, 'Address must be a String, Array, or ServiceAddress'
        end
      end

      def workflow?
        self.service == 'workflow'
      end

      def service
        self.first
      end

      def namespace
        raise ArgumentError, 'Address must contain at least two parts' unless self.count >= 2
        self[0..-2].map{|k| k.to_sym}
      end

      def id
        self.last
      end

      def to_s
        self.join('::')
      end

      def workflow_address
        workflow_service_map = self[1..-1]
        ServiceAddress.new workflow_service_map
      end
    end
  end
end