// SPDX-License-Identifier: LGPL-2.1-or-later
// Copyright (c) 2012-2014 Monty Program Ab
// Copyright (c) 2015-2021 MariaDB Corporation Ab

package org.mariadb.jdbc.type;

import java.util.Arrays;

/** Multi polygon */
public class MultiPolygon implements Geometry {

  private final Polygon[] polygons;

  /**
   * Constructor
   *
   * @param polygons polygons
   */
  public MultiPolygon(Polygon[] polygons) {
    this.polygons = polygons;
  }

  /**
   * Get polygons
   *
   * @return polygons
   */
  public Polygon[] getPolygons() {
    return polygons;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder("MULTIPOLYGON(");
    int indexpoly = 0;
    for (Polygon poly : polygons) {
      if (indexpoly++ > 0) {
        sb.append(",");
      }
      sb.append("(");
      int indexLine = 0;
      for (LineString ls : poly.getLines()) {
        if (indexLine++ > 0) {
          sb.append(",");
        }
        sb.append("(");
        int index = 0;
        for (Point pt : ls.getPoints()) {
          if (index++ > 0) {
            sb.append(",");
          }
          sb.append(pt.getX()).append(" ").append(pt.getY());
        }
        sb.append(")");
      }
      sb.append(")");
    }
    sb.append(")");
    return sb.toString();
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || !(o instanceof MultiPolygon)) return false;
    return toString().equals(o.toString());
  }

  @Override
  public int hashCode() {
    return Arrays.hashCode(polygons);
  }
}
