/*
* Copyright (C) 2009-2017 Slava Semushin <slava.semushin@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package ru.mystamps.web.model;
import java.math.BigDecimal;
import javax.validation.GroupSequence;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.Range;
import org.springframework.web.multipart.MultipartFile;
import lombok.Getter;
import lombok.Setter;
import ru.mystamps.web.controller.converter.annotation.Category;
import ru.mystamps.web.controller.converter.annotation.Country;
import ru.mystamps.web.dao.dto.LinkEntityDto;
import ru.mystamps.web.service.dto.AddSeriesDto;
import ru.mystamps.web.validation.jsr303.CatalogNumbers;
import ru.mystamps.web.validation.jsr303.ImageFile;
import ru.mystamps.web.validation.jsr303.MaxFileSize;
import ru.mystamps.web.validation.jsr303.MaxFileSize.Unit;
import ru.mystamps.web.validation.jsr303.NotEmptyFile;
import ru.mystamps.web.validation.jsr303.NotEmptyFilename;
import ru.mystamps.web.validation.jsr303.NotNullIfFirstField;
import ru.mystamps.web.validation.jsr303.Price;
import ru.mystamps.web.validation.jsr303.ReleaseDateIsNotInFuture;
import static ru.mystamps.web.validation.ValidationRules.MAX_DAYS_IN_MONTH;
import static ru.mystamps.web.validation.ValidationRules.MAX_IMAGE_SIZE;
import static ru.mystamps.web.validation.ValidationRules.MAX_MONTHS_IN_YEAR;
import static ru.mystamps.web.validation.ValidationRules.MAX_SERIES_COMMENT_LENGTH;
import static ru.mystamps.web.validation.ValidationRules.MAX_STAMPS_IN_SERIES;
import static ru.mystamps.web.validation.ValidationRules.MIN_RELEASE_YEAR;
import static ru.mystamps.web.validation.ValidationRules.MIN_STAMPS_IN_SERIES;
@Getter
@Setter
// TODO: combine price with currency to separate class
@SuppressWarnings({"PMD.TooManyFields", "PMD.AvoidDuplicateLiterals"})
@NotNullIfFirstField.List({
@NotNullIfFirstField(
first = "month", second = "year", message = "{month.requires.year}",
groups = AddSeriesForm.ReleaseDate1Checks.class
),
@NotNullIfFirstField(
first = "day", second = "month", message = "{day.requires.month}",
groups = AddSeriesForm.ReleaseDate1Checks.class
)
})
@ReleaseDateIsNotInFuture(groups = AddSeriesForm.ReleaseDate3Checks.class)
public class AddSeriesForm implements AddSeriesDto {
// FIXME: change type to plain Integer
@NotNull
@Category
private LinkEntityDto category;
// FIXME: change type to plain Integer
@Country
private LinkEntityDto country;
@Range(min = 1, max = MAX_DAYS_IN_MONTH, message = "{day.invalid}")
private Integer day;
@Range(min = 1, max = MAX_MONTHS_IN_YEAR, message = "{month.invalid}")
private Integer month;
@Min(
value = MIN_RELEASE_YEAR,
message = "{series.too-early-release-year}",
groups = ReleaseDate2Checks.class
)
private Integer year;
@NotNull
@Min(MIN_STAMPS_IN_SERIES)
@Max(MAX_STAMPS_IN_SERIES)
private Integer quantity;
@NotNull
private Boolean perforated;
@CatalogNumbers
private String michelNumbers;
@Price
private BigDecimal michelPrice;
@CatalogNumbers
private String scottNumbers;
@Price
private BigDecimal scottPrice;
@CatalogNumbers
private String yvertNumbers;
@Price
private BigDecimal yvertPrice;
@CatalogNumbers
private String gibbonsNumbers;
@Price
private BigDecimal gibbonsPrice;
@Size(max = MAX_SERIES_COMMENT_LENGTH, message = "{value.too-long}")
private String comment;
@NotNull
@NotEmptyFilename(groups = Image1Checks.class)
@NotEmptyFile(groups = Image2Checks.class)
@MaxFileSize(value = MAX_IMAGE_SIZE, unit = Unit.Kbytes, groups = Image3Checks.class)
@ImageFile(groups = Image3Checks.class)
private MultipartFile image;
@GroupSequence({
ReleaseDate1Checks.class,
ReleaseDate2Checks.class,
ReleaseDate3Checks.class
})
public interface ReleaseDateChecks {
}
public interface ReleaseDate1Checks {
}
public interface ReleaseDate2Checks {
}
public interface ReleaseDate3Checks {
}
@GroupSequence({
Image1Checks.class,
Image2Checks.class,
Image3Checks.class
})
public interface ImageChecks {
}
public interface Image1Checks {
}
public interface Image2Checks {
}
public interface Image3Checks {
}
}