package com.onthegomap.flatmap.geo;

import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.Lineal;
import org.locationtech.jts.geom.Polygonal;
import org.locationtech.jts.geom.Puntal;
import vector_tile.VectorTileProto;

public enum GeometryType {
  UNKNOWN(VectorTileProto.Tile.GeomType.UNKNOWN, 0),
  POINT(VectorTileProto.Tile.GeomType.POINT, 1),
  LINE(VectorTileProto.Tile.GeomType.LINESTRING, 2),
  POLYGON(VectorTileProto.Tile.GeomType.POLYGON, 4);

  private final VectorTileProto.Tile.GeomType protobufType;
  private int minPoints;

  GeometryType(VectorTileProto.Tile.GeomType protobufType, int minPoints) {
    this.protobufType = protobufType;
    this.minPoints = minPoints;
  }

  public static GeometryType valueOf(Geometry geom) {
    return geom instanceof Puntal ? POINT
      : geom instanceof Lineal ? LINE
        : geom instanceof Polygonal ? POLYGON
          : UNKNOWN;
  }

  public static GeometryType valueOf(VectorTileProto.Tile.GeomType geomType) {
    return switch (geomType) {
      case POINT -> POINT;
      case LINESTRING -> LINE;
      case POLYGON -> POLYGON;
      default -> UNKNOWN;
    };
  }

  public static GeometryType valueOf(byte val) {
    return valueOf(VectorTileProto.Tile.GeomType.forNumber(val));
  }

  public byte asByte() {
    return (byte) protobufType.getNumber();
  }

  public VectorTileProto.Tile.GeomType asProtobufType() {
    return protobufType;
  }

  public int minPoints() {
    return minPoints;
  }
}
