/**
 * NOTE: This class is auto generated by the swagger code generator program (2.4.9).
 * https://github.com/swagger-api/swagger-codegen
 * Do not edit the class manually.
 */
package com.chtrembl.petstore.pet.api;

import java.util.List;
import java.util.Optional;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.multipart.MultipartFile;

import com.chtrembl.petstore.pet.model.DataPreload;
import com.chtrembl.petstore.pet.model.ModelApiResponse;
import com.chtrembl.petstore.pet.model.Pet;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import io.swagger.annotations.Authorization;
import io.swagger.annotations.AuthorizationScope;

@javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2021-12-20T15:31:39.272-05:00")

@Api(value = "pet", description = "the pet API")
public interface PetApi {

	// wired in for the scenario the interface declarations need access to scoped
	// beans, all implementation should occur in Controller tho
	default Optional<NativeWebRequest> getRequest() {
		return Optional.empty();
	}

	// wired in for the scenario the interface declarations need access to scoped
	// beans, all implementation should occur in Controller tho
	public DataPreload getBeanToBeAutowired();

	// wired in for the scenario the interface declarations need access to scoped
	// beans, all implementation should occur in Controller tho
	default List<Pet> getPreloadedPets() {
		return getBeanToBeAutowired().getPets();
	}

	@ApiOperation(value = "Add a new pet to the store", nickname = "addPet", notes = "", authorizations = {
			@Authorization(value = "petstore_auth", scopes = {
					@AuthorizationScope(scope = "write:pets", description = "modify pets in your account"),
					@AuthorizationScope(scope = "read:pets", description = "read your pets") }) }, tags = { "pet", })
	@ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") })
	@RequestMapping(value = "/pet", produces = { "application/json", "application/xml" }, consumes = {
			"application/json", "application/xml" }, method = RequestMethod.POST)
	ResponseEntity<Void> addPet(
			@ApiParam(value = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody Pet body);

	@ApiOperation(value = "Deletes a pet", nickname = "deletePet", notes = "", authorizations = {
			@Authorization(value = "petstore_auth", scopes = {
					@AuthorizationScope(scope = "write:pets", description = "modify pets in your account"),
					@AuthorizationScope(scope = "read:pets", description = "read your pets") }) }, tags = { "pet", })
	@ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid ID supplied"),
			@ApiResponse(code = 404, message = "Pet not found") })
	@RequestMapping(value = "/pet/{petId}", produces = { "application/json",
			"application/xml" }, method = RequestMethod.DELETE)
	ResponseEntity<Void> deletePet(
			@ApiParam(value = "Pet id to delete", required = true) @PathVariable("petId") Long petId,
			@ApiParam(value = "") @RequestHeader(value = "api_key", required = false) String apiKey);

	@ApiOperation(value = "Finds Pets by status", nickname = "findPetsByStatus", notes = "Multiple status values can be provided with comma separated strings", response = Pet.class, responseContainer = "List", authorizations = {
			@Authorization(value = "petstore_auth", scopes = {
					@AuthorizationScope(scope = "write:pets", description = "modify pets in your account"),
					@AuthorizationScope(scope = "read:pets", description = "read your pets") }) }, tags = { "pet", })
	@ApiResponses(value = {
			@ApiResponse(code = 200, message = "successful operation", response = Pet.class, responseContainer = "List"),
			@ApiResponse(code = 400, message = "Invalid status value") })
	@RequestMapping(value = "/pet/findByStatus", produces = { "application/json",
			"application/xml" }, method = RequestMethod.GET)
	ResponseEntity<List<Pet>> findPetsByStatus(
			@NotNull @ApiParam(value = "Status values that need to be considered for filter", required = true, allowableValues = "available, pending, sold") @Valid @RequestParam(value = "status", required = true) List<String> status);

	@ApiOperation(value = "Finds Pets by tags", nickname = "findPetsByTags", notes = "Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing.", response = Pet.class, responseContainer = "List", authorizations = {
			@Authorization(value = "petstore_auth", scopes = {
					@AuthorizationScope(scope = "write:pets", description = "modify pets in your account"),
					@AuthorizationScope(scope = "read:pets", description = "read your pets") }) }, tags = { "pet", })
	@ApiResponses(value = {
			@ApiResponse(code = 200, message = "successful operation", response = Pet.class, responseContainer = "List"),
			@ApiResponse(code = 400, message = "Invalid tag value") })
	@RequestMapping(value = "/pet/findByTags", produces = { "application/json",
			"application/xml" }, method = RequestMethod.GET)
	ResponseEntity<List<Pet>> findPetsByTags(
			@NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) List<String> tags);

	@ApiOperation(value = "Find pet by ID", nickname = "getPetById", notes = "Returns a single pet", response = Pet.class, authorizations = {
			@Authorization(value = "api_key") }, tags = { "pet", })
	@ApiResponses(value = { @ApiResponse(code = 200, message = "successful operation", response = Pet.class),
			@ApiResponse(code = 400, message = "Invalid ID supplied"),
			@ApiResponse(code = 404, message = "Pet not found") })
	@RequestMapping(value = "/pet/{petId}", produces = { "application/json",
			"application/xml" }, method = RequestMethod.GET)
	ResponseEntity<Pet> getPetById(
			@ApiParam(value = "ID of pet to return", required = true) @PathVariable("petId") Long petId);

	@ApiOperation(value = "Update an existing pet", nickname = "updatePet", notes = "", authorizations = {
			@Authorization(value = "petstore_auth", scopes = {
					@AuthorizationScope(scope = "write:pets", description = "modify pets in your account"),
					@AuthorizationScope(scope = "read:pets", description = "read your pets") }) }, tags = { "pet", })
	@ApiResponses(value = { @ApiResponse(code = 400, message = "Invalid ID supplied"),
			@ApiResponse(code = 404, message = "Pet not found"),
			@ApiResponse(code = 405, message = "Validation exception") })
	@RequestMapping(value = "/pet", produces = { "application/json", "application/xml" }, consumes = {
			"application/json", "application/xml" }, method = RequestMethod.PUT)
	ResponseEntity<Void> updatePet(
			@ApiParam(value = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody Pet body);

	@ApiOperation(value = "Updates a pet in the store with form data", nickname = "updatePetWithForm", notes = "", authorizations = {
			@Authorization(value = "petstore_auth", scopes = {
					@AuthorizationScope(scope = "write:pets", description = "modify pets in your account"),
					@AuthorizationScope(scope = "read:pets", description = "read your pets") }) }, tags = { "pet", })
	@ApiResponses(value = { @ApiResponse(code = 405, message = "Invalid input") })
	@RequestMapping(value = "/pet/{petId}", produces = { "application/json", "application/xml" }, consumes = {
			"application/x-www-form-urlencoded" }, method = RequestMethod.POST)
	ResponseEntity<Void> updatePetWithForm(
			@ApiParam(value = "ID of pet that needs to be updated", required = true) @PathVariable("petId") Long petId,
			@ApiParam(value = "Updated name of the pet") @RequestParam(value = "name", required = false) String name,
			@ApiParam(value = "Updated status of the pet") @RequestParam(value = "status", required = false) String status);

	@ApiOperation(value = "uploads an image", nickname = "uploadFile", notes = "", response = ModelApiResponse.class, authorizations = {
			@Authorization(value = "petstore_auth", scopes = {
					@AuthorizationScope(scope = "write:pets", description = "modify pets in your account"),
					@AuthorizationScope(scope = "read:pets", description = "read your pets") }) }, tags = { "pet", })
	@ApiResponses(value = {
			@ApiResponse(code = 200, message = "successful operation", response = ModelApiResponse.class) })
	@RequestMapping(value = "/pet/{petId}/uploadImage", produces = { "application/json" }, consumes = {
			"multipart/form-data" }, method = RequestMethod.POST)
	ResponseEntity<ModelApiResponse> uploadFile(
			@ApiParam(value = "ID of pet to update", required = true) @PathVariable("petId") Long petId,
			@ApiParam(value = "Additional data to pass to server") @RequestParam(value = "additionalMetadata", required = false) String additionalMetadata,
			@ApiParam(value = "file detail") @Valid @RequestPart("file") MultipartFile file);
}
