// -------------------------------------------------
// responses.tsp
// Standard responses that Graph will return.
// -------------------------------------------------
import "@typespec/http";
import "@microsoft/typespec-msgraph";
import "./shared-models.tsp";
import "./bodies.tsp";

using TypeSpec.Http;
using MsGraph;
using MsGraph.SharedModels;
using MsGraph.Bodies;

// Response models represent the response as a whole, including the status code, headers, and body.
namespace MsGraph.Responses {
  /** Response to represent a Microsoft Graph collection response payload. */
  model CollectionResponse<TResource, TStatus = 200, TBody = Bodies.CollectionBody<TResource>> 
    is Http.Response<TStatus> {
    ...Http.Body<TBody>;
  }

  /** Response to represent a Microsoft Graph paged collection response payload. */ 
  model PagedCollectionResponse<TResource, TStatus = 200, TBody = Bodies.PagedCollectionBody<TResource>>
    is CollectionResponse<TResource, TStatus, TBody>;

  /** Response to represent a Microsoft Graph individual resource response payload. */
  model ResourceResponse<TResource, TStatus = 200, TBody = TResource>
    is Http.Response<TStatus> {
    ...Http.Body<TBody>;
  }

  /** Response to represent a Microsoft Graph individual resource response payload. */
  model ScalarResponse<TScalar, TStatus = 200, TBody = TScalar>
    is Http.Response<TStatus> {
    ...Http.Body<TBody>;
  }

  /** Response to represent a Microsoft Graph resource creation response payload. */
  model ResourceCreatedResponse<TResource, TStatus = 201, TBody = TResource>
    is ResourceResponse<TResource, TStatus, TBody> {
    ...Http.LocationHeader
  }

  /** Response to represent a Microsoft Graph empty response payload. */
  model EmptyResponse
    is Http.Response<204>;
  
  /** Response to represent a Microsoft Graph error response payload. */
  model ErrorResponse<TStatus>
   is Http.Response<TStatus> {
    ...Http.Body<Bodies.ErrorBody>;
  }

  alias ResourceErrorResponse = ErrorResponse<400 | 404 | 429>;
  alias CollectionErrorResponse = ErrorResponse<400 | 429>;
  alias OperationErrorResponse = ErrorResponse<400 | 429>;
  
}
