/*
 * 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.
 */
/*
 * This code was generated by https://github.com/googleapis/google-api-java-client-services/
 * Modify at your own risk.
 */

package com.google.api.services.contentwarehouse.v1.model;

/**
 * A border represents a line of division between two features of the same type (i.e. United States
 * and Mexico, but not California and Mexico). Borders are only used for features that tile an area.
 * For example, country features have borders with one another because they tile an area of land.
 * Country features do not have borders with province features because those two types of features
 * may intersect with each other. The geometry of a border will often be similar (or derived from)
 * the geometry of the two features that it separates. However, it is useful to have borders
 * represented by stand-alone features for map-styling purposes. Ideally, the geometry in a border
 * feature would be exactly the same as the common edges of the polygonal geometry of the two
 * features. This may not always be true in practice. At some point in the future we would like to
 * build a network of borders for features that are supposed to tile with each other. The network
 * would be composed of different border types meeting at endpoint intersections. In the process of
 * building this network, we would perform small geometry corrections to ensure that the borders
 * align properly at all zoom levels. Border features are intended primarily for map drawing, and
 * they would rarely be useful for geocoding. One exception would be for famous borders like the
 * "Mason Dixon Line" or the "Berlin Wall." The standard feature properties have the following
 * interpretations: name - Borders rarely have names unless they notable in their own right (e.g.
 * "Mason Dixon Line", "Berlin Wall"). point - A border should not have point geometry. polyline - A
 * border should have a single polyline that represents the division between the two features.
 * polygon - A border should not have polygon geometry.
 *
 * <p> This is the Java data model class that specifies how to parse/serialize into the JSON that is
 * transmitted over HTTP when working with the Document AI Warehouse API. For a detailed explanation
 * see:
 * <a href="https://developers.google.com/api-client-library/java/google-http-java-client/json">https://developers.google.com/api-client-library/java/google-http-java-client/json</a>
 * </p>
 *
 * @author Google, Inc.
 */
@SuppressWarnings("javadoc")
public final class GeostoreBorderProto extends com.google.api.client.json.GenericJson {

  /**
   * The ids of the area features to the left and right of the border, relative to the start and end
   * of this borders' polyline geometry. These features should have the same type as the "type"
   * attribute above. These ids are not required because the corresponding features may be
   * nonexistent or difficult to obtain.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private GeostoreFeatureIdProto featureIdLeft;

  /**
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private GeostoreFeatureIdProto featureIdRight;

  /**
   * The logical borders which this border is a part of.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.util.List<GeostoreFeatureIdProto> logicalBorder;

  /**
   * List of border status overrides. Due to legal reasons, we may be required to display some
   * borders differently on some domains for instance.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.util.List<GeostoreOverrideBorderStatusProto> overrideStatus;

  /**
   * The border status identifies the legal status of the border line.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.String status;

  /**
   * The type of the features this border separates. Should always be a subtype of TYPE_POLITICAL.
   * NOTE: as of December 2019, we currently require this to be equal to TYPE_COUNTRY or
   * TYPE_ADMINISTRATIVE_AREA1. In the future, we may support TYPE_BORDER for lower types of
   * political features.
   * The value may be {@code null}.
   */
  @com.google.api.client.util.Key
  private java.lang.Integer type;

  /**
   * The ids of the area features to the left and right of the border, relative to the start and end
   * of this borders' polyline geometry. These features should have the same type as the "type"
   * attribute above. These ids are not required because the corresponding features may be
   * nonexistent or difficult to obtain.
   * @return value or {@code null} for none
   */
  public GeostoreFeatureIdProto getFeatureIdLeft() {
    return featureIdLeft;
  }

  /**
   * The ids of the area features to the left and right of the border, relative to the start and end
   * of this borders' polyline geometry. These features should have the same type as the "type"
   * attribute above. These ids are not required because the corresponding features may be
   * nonexistent or difficult to obtain.
   * @param featureIdLeft featureIdLeft or {@code null} for none
   */
  public GeostoreBorderProto setFeatureIdLeft(GeostoreFeatureIdProto featureIdLeft) {
    this.featureIdLeft = featureIdLeft;
    return this;
  }

  /**
   * @return value or {@code null} for none
   */
  public GeostoreFeatureIdProto getFeatureIdRight() {
    return featureIdRight;
  }

  /**
   * @param featureIdRight featureIdRight or {@code null} for none
   */
  public GeostoreBorderProto setFeatureIdRight(GeostoreFeatureIdProto featureIdRight) {
    this.featureIdRight = featureIdRight;
    return this;
  }

  /**
   * The logical borders which this border is a part of.
   * @return value or {@code null} for none
   */
  public java.util.List<GeostoreFeatureIdProto> getLogicalBorder() {
    return logicalBorder;
  }

  /**
   * The logical borders which this border is a part of.
   * @param logicalBorder logicalBorder or {@code null} for none
   */
  public GeostoreBorderProto setLogicalBorder(java.util.List<GeostoreFeatureIdProto> logicalBorder) {
    this.logicalBorder = logicalBorder;
    return this;
  }

  /**
   * List of border status overrides. Due to legal reasons, we may be required to display some
   * borders differently on some domains for instance.
   * @return value or {@code null} for none
   */
  public java.util.List<GeostoreOverrideBorderStatusProto> getOverrideStatus() {
    return overrideStatus;
  }

  /**
   * List of border status overrides. Due to legal reasons, we may be required to display some
   * borders differently on some domains for instance.
   * @param overrideStatus overrideStatus or {@code null} for none
   */
  public GeostoreBorderProto setOverrideStatus(java.util.List<GeostoreOverrideBorderStatusProto> overrideStatus) {
    this.overrideStatus = overrideStatus;
    return this;
  }

  /**
   * The border status identifies the legal status of the border line.
   * @return value or {@code null} for none
   */
  public java.lang.String getStatus() {
    return status;
  }

  /**
   * The border status identifies the legal status of the border line.
   * @param status status or {@code null} for none
   */
  public GeostoreBorderProto setStatus(java.lang.String status) {
    this.status = status;
    return this;
  }

  /**
   * The type of the features this border separates. Should always be a subtype of TYPE_POLITICAL.
   * NOTE: as of December 2019, we currently require this to be equal to TYPE_COUNTRY or
   * TYPE_ADMINISTRATIVE_AREA1. In the future, we may support TYPE_BORDER for lower types of
   * political features.
   * @return value or {@code null} for none
   */
  public java.lang.Integer getType() {
    return type;
  }

  /**
   * The type of the features this border separates. Should always be a subtype of TYPE_POLITICAL.
   * NOTE: as of December 2019, we currently require this to be equal to TYPE_COUNTRY or
   * TYPE_ADMINISTRATIVE_AREA1. In the future, we may support TYPE_BORDER for lower types of
   * political features.
   * @param type type or {@code null} for none
   */
  public GeostoreBorderProto setType(java.lang.Integer type) {
    this.type = type;
    return this;
  }

  @Override
  public GeostoreBorderProto set(String fieldName, Object value) {
    return (GeostoreBorderProto) super.set(fieldName, value);
  }

  @Override
  public GeostoreBorderProto clone() {
    return (GeostoreBorderProto) super.clone();
  }

}
