#
# Licensed to Elasticsearch under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch licenses this file to you 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.
#

#
# Painless definition file. This defines the hierarchy of classes,
# what methods and fields they have, etc.
#

#### Primitive types

class void -> void {
}

class boolean -> boolean {
}

class byte -> byte {
}

class short -> short {
}

class char -> char {
}

class int -> int {
}

class long -> long {
}

class float -> float {
}

class double -> double {
}

class def -> java.lang.Object {
  boolean equals(Object)
  int hashCode()
  String toString()
}


#### Painless debugging API

class Debug -> org.elasticsearch.painless.api.Debug extends Object {
  void explain(Object)
}

#### ES Scripting API

class org.elasticsearch.common.geo.GeoPoint -> org.elasticsearch.common.geo.GeoPoint extends Object {
  double getLat()
  double getLon()
}

class org.elasticsearch.index.fielddata.ScriptDocValues.Strings -> org.elasticsearch.index.fielddata.ScriptDocValues$Strings extends List,Collection,Iterable,Object {
  String get(int)
  String getValue()
  List getValues()
}

class org.elasticsearch.index.fielddata.ScriptDocValues.Longs -> org.elasticsearch.index.fielddata.ScriptDocValues$Longs extends List,Collection,Iterable,Object {
  Long get(int)
  long getValue()
  List getValues()
  org.joda.time.ReadableDateTime getDate()
  List getDates()
}

class org.elasticsearch.index.fielddata.ScriptDocValues.Dates -> org.elasticsearch.index.fielddata.ScriptDocValues$Dates extends List,Collection,Iterable,Object {
  org.joda.time.ReadableDateTime get(int)
  org.joda.time.ReadableDateTime getValue()
  List getValues()
  org.joda.time.ReadableDateTime getDate()
  List getDates()
}

class org.elasticsearch.index.fielddata.ScriptDocValues.Doubles -> org.elasticsearch.index.fielddata.ScriptDocValues$Doubles extends List,Collection,Iterable,Object {
  Double get(int)
  double getValue()
  List getValues()
}

class org.elasticsearch.index.fielddata.ScriptDocValues.GeoPoints -> org.elasticsearch.index.fielddata.ScriptDocValues$GeoPoints extends List,Collection,Iterable,Object {
  org.elasticsearch.common.geo.GeoPoint get(int)
  org.elasticsearch.common.geo.GeoPoint getValue()
  List getValues()
  double getLat()
  double getLon()
  double[] getLats()
  double[] getLons()

  # geo distance functions
  double arcDistance(double,double)
  double arcDistanceWithDefault(double,double,double)
  double planeDistance(double,double)
  double planeDistanceWithDefault(double,double,double)
  double geohashDistance(String)
  double geohashDistanceWithDefault(String,double)
}

class org.elasticsearch.index.fielddata.ScriptDocValues.Booleans -> org.elasticsearch.index.fielddata.ScriptDocValues$Booleans extends List,Collection,Iterable,Object {
  Boolean get(int)
  boolean getValue()
  List getValues()
}

class org.elasticsearch.index.fielddata.ScriptDocValues.BytesRefs -> org.elasticsearch.index.fielddata.ScriptDocValues$BytesRefs extends List,Collection,Iterable,Object {
  BytesRef get(int)
  BytesRef getValue()
  List getValues()
}

class BytesRef -> org.apache.lucene.util.BytesRef extends Object {
  byte[] bytes
  int offset
  int length
  boolean bytesEquals(BytesRef)
  String utf8ToString()
}

class org.elasticsearch.index.mapper.IpFieldMapper.IpFieldType.IpScriptDocValues -> org.elasticsearch.index.mapper.IpFieldMapper$IpFieldType$IpScriptDocValues extends List,Collection,Iterable,Object {
  String get(int)
  String getValue()
  List getValues()
}

# for testing.
# currently FeatureTest exposes overloaded constructor, field load store, and overloaded static methods
class org.elasticsearch.painless.FeatureTest -> org.elasticsearch.painless.FeatureTest extends Object {
  org.elasticsearch.painless.FeatureTest <init>()
  org.elasticsearch.painless.FeatureTest <init>(int,int)
  int getX()
  int getY()
  void setX(int)
  void setY(int)
  boolean overloadedStatic()
  boolean overloadedStatic(boolean)
  Object twoFunctionsOfX(Function,Function)
  void listInput(List)
}

class org.elasticsearch.search.lookup.FieldLookup -> org.elasticsearch.search.lookup.FieldLookup extends Object {
  def getValue()
  List getValues()
  boolean isEmpty()
}
