// Copyright © 2016 HSL <https://www.hsl.fi>
// This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses.
package fi.hsl.parkandride.core.domain;
import fi.hsl.parkandride.core.domain.validation.ElementLength;
import fi.hsl.parkandride.core.domain.validation.NotBlankElement;
import fi.hsl.parkandride.core.domain.validation.NotNullElement;
import org.joda.time.DateTime;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Set;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newLinkedHashSet;
import static java.util.Collections.sort;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toSet;
public class Facility extends FacilityInfo {
@NotNull
@NotNullElement
@Valid
public List<Pricing> pricing = newArrayList();
@NotNull
@NotNullElement
@Valid
public List<UnavailableCapacity> unavailableCapacities = newArrayList();
@NotNull
@NotBlankElement
@ElementLength(min = 0, max = 255)
public Set<String> aliases = newLinkedHashSet();
@NotNull
@NotNullElement
@Valid
public List<Port> ports = newArrayList();
@NotNull
@NotNullElement
public NullSafeSortedSet<Service> services = new NullSafeSortedSet<>();
@NotNull
@Valid
public FacilityContacts contacts = new FacilityContacts();
@NotNull
@Valid
public FacilityPaymentInfo paymentInfo = new FacilityPaymentInfo();
@NotNull
@Valid
public OpeningHours openingHours = new OpeningHours();
/**
* Expects a valid facility
*/
public void initialize() {
sort(pricing, Pricing.COMPARATOR);
sort(unavailableCapacities, UnavailableCapacity.COMPARATOR);
openingHours.initialize(pricing, new DateTime(), status);
}
public Set<Usage> analyzeUsages() {
return pricing.stream().collect(mapping(Pricing::getUsage, toSet()));
}
public void normalize() {
this.pricing = pricingMethod.getPricing(this);
}
}