import Quadtree from '../index/quadtree/Quadtree'
import ItemVisitor from '../index/ItemVisitor'
import LineSegment from '../geom/LineSegment'
import ArrayList from '../../../../java/util/ArrayList'
import Envelope from '../geom/Envelope'
import TaggedLineString from './TaggedLineString'
export default class LineSegmentIndex {
  constructor() {
    LineSegmentIndex.constructor_.apply(this, arguments)
  }
  static constructor_() {
    this._index = new Quadtree()
  }
  remove(seg) {
    this._index.remove(new Envelope(seg.p0, seg.p1), seg)
  }
  add() {
    if (arguments[0] instanceof TaggedLineString) {
      const line = arguments[0]
      const segs = line.getSegments()
      for (let i = 0; i < segs.length; i++) {
        const seg = segs[i]
        this.add(seg)
      }
    } else if (arguments[0] instanceof LineSegment) {
      const seg = arguments[0]
      this._index.insert(new Envelope(seg.p0, seg.p1), seg)
    }
  }
  query(querySeg) {
    const env = new Envelope(querySeg.p0, querySeg.p1)
    const visitor = new LineSegmentVisitor(querySeg)
    this._index.query(env, visitor)
    const itemsFound = visitor.getItems()
    return itemsFound
  }
}
class LineSegmentVisitor {
  constructor() {
    LineSegmentVisitor.constructor_.apply(this, arguments)
  }
  static constructor_() {
    this._querySeg = null
    this._items = new ArrayList()
    const querySeg = arguments[0]
    this._querySeg = querySeg
  }
  visitItem(item) {
    const seg = item
    if (Envelope.intersects(seg.p0, seg.p1, this._querySeg.p0, this._querySeg.p1)) this._items.add(item)
  }
  getItems() {
    return this._items
  }
  get interfaces_() {
    return [ItemVisitor]
  }
}