module Ribose
  class Conversation < Ribose::Base
    include Ribose::Actions::All
    include Ribose::Actions::Fetch
    include Ribose::Actions::Create
    include Ribose::Actions::Update
    include Ribose::Actions::Delete

    # Listing Space Conversations
    #
    # @param space_id [String] The Space UUID
    # @param options [Hash] Query parameters as a Hash
    # @return [Array <Sawyer::Resource>]
    #
    def self.all(space_id, options = {})
      new(space_id: space_id, **options).all
    end

    # Fetch a conversation
    #
    # @param space_id [String] The Space UUID
    # @param conversation_id [String] Conversation UUID
    # @param options [Hash] Query parameters as a Hash
    # @return [Sawyer::Resource] The conversation
    #
    def self.fetch(space_id, conversation_id, options = {})
      new(space_id: space_id, conversation_id: conversation_id, **options).fetch
    end

    # Create A New Conversation
    #
    # @param space_id [String] The Space UUID
    # @param attributes [Hash] The conversation attributes
    # @return [Sawyer::Resource]
    #
    def self.create(space_id, attributes)
      new(attributes.merge(space_id: space_id)).create
    end

    # Update a conversation
    #
    # @param space_id [String] The Space UUID
    # @param conversation_id [String] Conversation UUID
    # @param attributes [Hash] Query parameters as a Hash
    # @return [Sawyer::Resource] The updated conversation
    #
    def self.update(space_id, conversation_id, attributes = {})
      new(
        space_id: space_id,
        conversation_id: conversation_id,
        **attributes,
      ).update
    end

    # Remove a conversation
    #
    # @param space_id [String] The Space UUID
    # @param conversation_id [String] Conversation UUID
    # @param options [Hash] Query parameters as a Hash
    #
    def self.destroy(space_id:, conversation_id:, **opts)
      new(space_id: space_id, conversation_id: conversation_id, **opts).delete
    end

    private

    attr_reader :space_id, :conversation_id
    alias_method :resource_id, :conversation_id

    def extract_local_attributes
      @space_id = attributes.delete(:space_id)
      @conversation_id = attributes.delete(:conversation_id)
    end

    def resource
      "conversation"
    end

    def resources_path
      ["spaces", space_id, "conversation", "conversations"].join("/")
    end

    def validate(attributes)
      attributes.merge(space_id: space_id)
    end
  end
end