/**
 * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech) (4.3.1).
 * https://openapi-generator.tech
 * Do not edit the class manually.
 */
package org.openapitools.api;

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

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

import org.openapitools.model.DataPreload;
import org.openapitools.model.ModelApiResponse;
import org.openapitools.model.Pet;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
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.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

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 = "org.openapitools.codegen.languages.SpringCodegen", date = "2021-04-12T22:51:57.491293-04:00[America/New_York]")

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

	default Optional<NativeWebRequest> getRequest() {
		return Optional.empty();
	}

	public DataPreload getBeanToBeAutowired();

	default List<Pet> getPreloadedPets() {
		return getBeanToBeAutowired().getPets();
	}

	/**
	 * POST /pet : Add a new pet to the store
	 *
	 * @param body Pet object that needs to be added to the store (required)
	 * @return Invalid input (status code 405)
	 */
	@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", consumes = { "application/json", "application/xml" }, method = RequestMethod.POST)
	default ResponseEntity<Void> addPet(
			@ApiParam(value = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody Pet body) {
		return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

	}

	/**
	 * DELETE /pet/{petId} : Deletes a pet
	 *
	 * @param petId  Pet id to delete (required)
	 * @param apiKey (optional)
	 * @return Invalid ID supplied (status code 400) or Pet not found (status code
	 *         404)
	 */
	@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}", method = RequestMethod.DELETE)
	default 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) {
		return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

	}

	/**
	 * GET /pet/findByStatus : Finds Pets by status Multiple status values can be
	 * provided with comma separated strings
	 *
	 * @param status Status values that need to be considered for filter (required)
	 * @return successful operation (status code 200) or Invalid status value
	 *         (status code 400)
	 */
	@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)
	default 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) {
		getRequest().ifPresent(request -> {
			for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) {
				if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
					try {
						PetApiController.logger.info(String.format(
								"PetStoreService incoming GET request to /v2/pet/findPetsByStatus?status=%s", status));
						String petsJSON = new ObjectMapper().writeValueAsString(this.getPreloadedPets());
						ApiUtil.setExampleResponse(request, "application/json", petsJSON);
					} catch (JsonProcessingException e) {
						e.printStackTrace();
						String exampleString = "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\" }";
						ApiUtil.setExampleResponse(request, "application/json", exampleString);
					}
					break;
				}
				if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) {
					String exampleString = "<Pet> <id>123456789</id> <name>doggie</name> <photoUrls> <photoUrls>aeiou</photoUrls> </photoUrls> <tags> </tags> <status>aeiou</status> </Pet>";
					ApiUtil.setExampleResponse(request, "application/xml", exampleString);
					break;
				}
			}
		});

		return new ResponseEntity<>(HttpStatus.OK);

	}

	/**
	 * GET /pet/findByTags : Finds Pets by tags Multiple tags can be provided with
	 * comma separated strings. Use tag1, tag2, tag3 for testing.
	 *
	 * @param tags Tags to filter by (required)
	 * @return successful operation (status code 200) or Invalid tag value (status
	 *         code 400)
	 * @deprecated
	 */
	@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)
	default ResponseEntity<List<Pet>> findPetsByTags(
			@NotNull @ApiParam(value = "Tags to filter by", required = true) @Valid @RequestParam(value = "tags", required = true) List<String> tags) {
		getRequest().ifPresent(request -> {
			for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) {
				if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
					String exampleString = "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\" }";
					ApiUtil.setExampleResponse(request, "application/json", exampleString);
					break;
				}
				if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) {
					String exampleString = "<Pet> <id>123456789</id> <name>doggie</name> <photoUrls> <photoUrls>aeiou</photoUrls> </photoUrls> <tags> </tags> <status>aeiou</status> </Pet>";
					ApiUtil.setExampleResponse(request, "application/xml", exampleString);
					break;
				}
			}
		});
		return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

	}

	/**
	 * GET /pet/{petId} : Find pet by ID Returns a single pet
	 *
	 * @param petId ID of pet to return (required)
	 * @return successful operation (status code 200) or Invalid ID supplied (status
	 *         code 400) or Pet not found (status code 404)
	 */
	@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)
	default ResponseEntity<Pet> getPetById(
			@ApiParam(value = "ID of pet to return", required = true) @PathVariable("petId") Long petId) {
		getRequest().ifPresent(request -> {
			for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) {
				if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
					String exampleString = "{ \"photoUrls\" : [ \"photoUrls\", \"photoUrls\" ], \"name\" : \"doggie\", \"id\" : 0, \"category\" : { \"name\" : \"name\", \"id\" : 6 }, \"tags\" : [ { \"name\" : \"name\", \"id\" : 1 }, { \"name\" : \"name\", \"id\" : 1 } ], \"status\" : \"available\" }";
					ApiUtil.setExampleResponse(request, "application/json", exampleString);
					break;
				}
				if (mediaType.isCompatibleWith(MediaType.valueOf("application/xml"))) {
					String exampleString = "<Pet> <id>123456789</id> <name>doggie</name> <photoUrls> <photoUrls>aeiou</photoUrls> </photoUrls> <tags> </tags> <status>aeiou</status> </Pet>";
					ApiUtil.setExampleResponse(request, "application/xml", exampleString);
					break;
				}
			}
		});
		return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

	}

	/**
	 * PUT /pet : Update an existing pet
	 *
	 * @param body Pet object that needs to be added to the store (required)
	 * @return Invalid ID supplied (status code 400) or Pet not found (status code
	 *         404) or Validation exception (status code 405)
	 */
	@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", consumes = { "application/json", "application/xml" }, method = RequestMethod.PUT)
	default ResponseEntity<Void> updatePet(
			@ApiParam(value = "Pet object that needs to be added to the store", required = true) @Valid @RequestBody Pet body) {
		return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

	}

	/**
	 * POST /pet/{petId} : Updates a pet in the store with form data
	 *
	 * @param petId  ID of pet that needs to be updated (required)
	 * @param name   Updated name of the pet (optional)
	 * @param status Updated status of the pet (optional)
	 * @return Invalid input (status code 405)
	 */
	@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}", consumes = {
			"application/x-www-form-urlencoded" }, method = RequestMethod.POST)
	default 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") @RequestPart(value = "name", required = false) String name,
			@ApiParam(value = "Updated status of the pet") @RequestPart(value = "status", required = false) String status) {
		return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

	}

	/**
	 * POST /pet/{petId}/uploadImage : uploads an image
	 *
	 * @param petId              ID of pet to update (required)
	 * @param additionalMetadata Additional data to pass to server (optional)
	 * @param file               file to upload (optional)
	 * @return successful operation (status code 200)
	 */
	@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)
	default ResponseEntity<ModelApiResponse> uploadFile(
			@ApiParam(value = "ID of pet to update", required = true) @PathVariable("petId") Long petId,
			@ApiParam(value = "Additional data to pass to server") @RequestPart(value = "additionalMetadata", required = false) String additionalMetadata,
			@ApiParam(value = "file to upload") @Valid @RequestPart(value = "file") MultipartFile file) {
		getRequest().ifPresent(request -> {
			for (MediaType mediaType : MediaType.parseMediaTypes(request.getHeader("Accept"))) {
				if (mediaType.isCompatibleWith(MediaType.valueOf("application/json"))) {
					String exampleString = "{ \"code\" : 0, \"type\" : \"type\", \"message\" : \"message\" }";
					ApiUtil.setExampleResponse(request, "application/json", exampleString);
					break;
				}
			}
		});
		return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

	}

}
