// ***************************************************************************************************************************
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
// * with the License.  You may obtain a copy of the License at                                                              *
// *                                                                                                                         *
// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
// *                                                                                                                         *
// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
// * specific language governing permissions and limitations under the License.                                              *
// ***************************************************************************************************************************
package org.apache.juneau.petstore.dto;

import org.apache.juneau.annotation.*;
import org.apache.juneau.jsonschema.annotation.*;

/**
 * Bean for creating {@link Pet} objects.
 *
 * <ul class='seealso'>
 * 	<li class='extlink'>{@source}
 * </ul>
 */
@Bean(fluentSetters=true, properties="name,price,species,tags")
public class CreatePet {

	@Schema(description="Pet name.", minLength=3, maxLength=50)
	private String name;

	@Schema(description="Price of pet.", maximum="999.99")
	private float price;

	@Schema(description="Pet species.")
	private Species species;

	@Schema(description="Pet attributes.", example="friendly,smart")
	private String[] tags;

	/**
	 * Constructor.
	 *
	 * @param name The <bc>name</bc> property value.
	 * @param price The <bc>price</bc> property value.
	 * @param species The <bc>species</bc> property value.
	 * @param tags The <bc>tags</bc> property value.
	 */
	public CreatePet(String name, float price, Species species, String[] tags) {
		this.name = name;
		this.price = price;
		this.species = species;
		this.tags = tags;
	}

	/**
	 * Empty constructor.
	 */
	public CreatePet() {}

	//-----------------------------------------------------------------------------------------------------------------
	// Bean properties
	//-----------------------------------------------------------------------------------------------------------------

	/**
	 * @return The <bc>name</bc> property value.
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param value The <bc>name</bc> property value.
	 * @return This object (for method chaining).
	 */
	public CreatePet name(String value) {
		this.name = value;
		return this;
	}

	/**
	 * @return The <bc>price</bc> property value.
	 */
	public float getPrice() {
		return price;
	}

	/**
	 * @param value The <bc>price</bc> property value.
	 * @return This object (for method chaining).
	 */
	public CreatePet price(float value) {
		this.price = value;
		return this;
	}

	/**
	 * @return The <bc>species</bc> property value.
	 */
	public Species getSpecies() {
		return species;
	}

	/**
	 * @param value The <bc>species</bc> property value.
	 * @return This object (for method chaining).
	 */
	public CreatePet species(Species value) {
		this.species = value;
		return this;
	}

	/**
	 * @return The <bc>tags</bc> property value.
	 */
	public String[] getTags() {
		return tags;
	}

	/**
	 * @param value The <bc>tags</bc> property value.
	 * @return This object (for method chaining).
	 */
	public CreatePet tags(String...value) {
		this.tags = value;
		return this;
	}

	//-----------------------------------------------------------------------------------------------------------------
	// Other
	//-----------------------------------------------------------------------------------------------------------------

	/**
	 * @return An example POJO.
	 */
	public static CreatePet example() {
		return new CreatePet("Doggie", 9.99f, Species.DOG, new String[]{"smart","friendly"});
	}
}
