/*
 * Copyright 2017 Kuelap, Inc.
 *
 * Licensed 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 io.mifos.individuallending.api.v1.domain.product;

import io.mifos.portfolio.api.v1.validation.ValidLossProvisionList;

import java.util.List;
import java.util.Objects;

@SuppressWarnings("WeakerAccess")
public class LossProvisionConfiguration {
  @ValidLossProvisionList
  private List<LossProvisionStep> lossProvisionSteps;

  public LossProvisionConfiguration() {
  }

  public LossProvisionConfiguration(List<LossProvisionStep> lossProvisionSteps) {
    this.lossProvisionSteps = lossProvisionSteps;
  }

  public List<LossProvisionStep> getLossProvisionSteps() {
    return lossProvisionSteps;
  }

  public void setLossProvisionSteps(List<LossProvisionStep> lossProvisionSteps) {
    this.lossProvisionSteps = lossProvisionSteps;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    LossProvisionConfiguration that = (LossProvisionConfiguration) o;
    return Objects.equals(lossProvisionSteps, that.lossProvisionSteps);
  }

  @Override
  public int hashCode() {
    return Objects.hash(lossProvisionSteps);
  }

  @Override
  public String toString() {
    return "LossProvisionConfiguration{" +
        "lossProvisionSteps=" + lossProvisionSteps +
        '}';
  }
}
