package de.ivu.elect.business.gebietsbaum.control;

import java.util.ArrayList;
import java.util.List;

import de.ivu.elect.business.gebietsbaum.entity.GebietPolygon;


import static java.util.stream.Collectors.toList;

/**
 *  on 07.12.2015.
 */
public class GebietPolygonMerger {

  private final List<GebietPolygon> polygoneGebiet1;

  private final List<GebietPolygon> polygoneGebiet2;

  private final GebietPolygonMergerVergleich gebietPolygonMergerVergleich;

  public GebietPolygonMerger(List<GebietPolygon> polygoneGebiet1, List<GebietPolygon> polygoneGebiet2 ,GebietPolygonMergerVergleich gebietPolygonMergerVergleich) {
    this.gebietPolygonMergerVergleich = gebietPolygonMergerVergleich;
    this.polygoneGebiet1 = polygoneGebiet1.stream().map(GebietPolygon::new).collect(toList());
    this.polygoneGebiet2 = polygoneGebiet2.stream().map(GebietPolygon::new).collect(toList());

  }

  List<GebietPolygon> mergeResult;

  public List<GebietPolygon> merge() {
    if (mergeResult == null) {
      mergeResult = mergeInternal();
    }
    return mergeResult;

  }

  private List<GebietPolygon> mergeInternal() {
    List<GebietPolygon> result = new ArrayList<>();

    result.addAll(polygoneGebiet1);
    result.addAll(polygoneGebiet2);

//    while (mergeInnerhalbListe(result)) {
//      // solange, bis es nichts mehr zu tun gibt
//    }


    return result;
  }
//
//  private boolean mergeInnerhalbListe(List<GebietPolygon> polygone) {
//    boolean veraenderungErfolgt;
//    veraenderungErfolgt = entferneZuKleinePolygone(polygone);
//
//    for (GebietPolygon gebietPolygon : polygone) {
//      veraenderungErfolgt|=sucheUndEntferneDoppelteKannteInnerhalb(gebietPolygon);
//    }
//
//    return veraenderungErfolgt;
//
//  }
//
//  private boolean sucheUndEntferneDoppelteKannteInnerhalb(GebietPolygon gebietPolygon) {
//
//    Pair<GebietPolygonPoint, GebietPolygonPoint> gemeinsamerStartPunkt = findeStartPunkteDoppelteKante(gebietPolygon);
//
//
//
//
//  }
//
//  private Pair<GebietPolygonPoint, GebietPolygonPoint> findeStartPunkteDoppelteKante(GebietPolygon gebietPolygon) {
//    for (GebietPolygonPoint gebietPolygonPointStart1 : gebietPolygon.getGebietPolygonPointListReadOnly()) {
//      for (GebietPolygonPoint gebietPolygonPointStart2 : gebietPolygon.getGebietPolygonPointListReadOnly()) {
//
//          GebietPolygonPoint gebietPolygonPointEnde1 = gebietPolygon.getNachfolger(gebietPolygonPointStart1);
//          GebietPolygonPoint gebietPolygonPointEnde2 = gebietPolygon.getNachfolger(gebietPolygonPointStart2);
//          if (istGleicherPunkt(nachfolger1, nachfolger2)) {
//            return new Pair<>(gebietPolygonPoint1, gebietPolygonPoint2);
//          }
//
//          GebietPolygonPoint vorgaenger1 = gebietPolygon.getNachfolger(gebietPolygonPoint1);
//          GebietPolygonPoint nachfolger2 = gebietPolygon.getNachfolger(gebietPolygonPoint2);
//          if (istGleicherPunkt(nachfolger1, nachfolger2)) {
//            return new Pair<>(gebietPolygonPoint1, gebietPolygonPoint2);
//          }
//
//
//        }
//
//      }
//    }
//  }
//
//  private boolean entferneZuKleinePolygone(List<GebietPolygon> polygone) {
//    boolean veraenderungErfolgt;
//    Set<GebietPolygon> zuEntfernen = new HashSet<>();
//    for (GebietPolygon gebietPolygon : polygone) {
//      if (gebietPolygon.getAnzahlPunkte() < 3) {
//        zuEntfernen.add(gebietPolygon);
//      }
//    }
//    veraenderungErfolgt = zuEntfernen.isEmpty();
//    polygone.removeAll(zuEntfernen);
//    return veraenderungErfolgt;
//  }

}
