/**
   * deze methode koppelt de opgegeven trainer aan de opgegeven ploeg
   *
   * @param naam de naam van de trainer
   * @param voornaam de voornaam van de trainer
   * @param ploegnaam de ploegnaam van de ploeg
   * @throws DBException
   * @throws ApplicationException
   */
  public void toevoegenTrainerPloeg(String naam, String voornaam, String ploegnaam)
      throws DBException, ApplicationException {

    Persoon persoon = persoonDB.zoekPersoon(naam, voornaam);
    Ploeg ploeg = zoekPloeg(ploegnaam);
    toevoegenTrainerPloeg(persoon.getId(), ploeg.getId());
  }
  @Test
  public void SpelersZoekenVanPLoeg() throws Exception {
    Persoon a = new Persoon();
    a.setGeboortedatum(1980, 3, 21);
    a.setNaam("Visiao");
    a.setVoornaam("Messi");

    Persoon b = new Persoon();
    b.setGeboortedatum(1979, 6, 13);
    b.setNaam("Plumita");
    b.setVoornaam("Ronaldo");

    persoonDB.toevoegenPersoon(a);
    persoonDB.toevoegenPersoon(b);

    Ploeg p = new Ploeg();
    p.setNaam("Los farsantes");
    p.setCategorie(Categorie.U9);
    ploegDB.toevoegenPloeg(p);
    ploegDB.toevoegenSpelerPloeg(p, a);
    ploegDB.toevoegenSpelerPloeg(p, b);

    ArrayList array = ploegDB.zoekSpelersPloeg(p);

    for (int i = 0; i < array.size(); i++) {
      System.out.println(array.get(i));
    }
  }
  /**
   * deze methode zoekt de trainer op van de opgegeven ploeg
   *
   * @param ploegnaam de naam van de ploeg waarvan je de trainer wilt zoeken
   * @return
   * @throws DBException
   */
  public Persoon getTrainer(String ploegnaam) throws DBException {
    try (Connection conn = ConnectionManager.getConnection(); ) {

      // preparedStatement opstellen (en automtisch sluiten)
      try (PreparedStatement stmt =
          conn.prepareStatement(
              "select id,naam,voornaam,geboortedatum,isTrainer,opmerking from persoon where id in (select trainer_id from ploeg where id in (select id from ploeg where naam='?'))"); ) {
        // execute voert elke sql-statement uit, executeQuery enkel de eenvoudige
        stmt.execute();
        // result opvragen (en automatisch sluiten)
        try (ResultSet r = stmt.getResultSet()) {
          Persoon k = new Persoon();
          while (r.next()) {

            k.setId(r.getInt("id"));
            k.setNaam(r.getString("naam"));
            k.setVoornaam(r.getString("voornaam"));
            k.setGeboortedatum(r.getDate("geboortedatum"));
            k.setTrainer(r.getBoolean("isTrainer"));
            k.setOpmerking(r.getString("opmerking"));
          }
          return k;
        } catch (SQLException sqlEx) {
          throw new DBException(
              "SQL-exception in getTrainer (String ploegnaam) - resultset" + sqlEx);
        }
      } catch (SQLException sqlEx) {
        throw new DBException("SQL-exception in getTrainer (String ploegnaam) - statement" + sqlEx);
      }
    } catch (SQLException sqlEx) {
      throw new DBException("SQL-exception in getTrainer (String ploegnaam) - connection" + sqlEx);
    }
  }
  @Test
  public void koppelenTrainerAanPloeg() throws Exception {
    Ploeg ploeg = new Ploeg();
    ploeg.setCategorie(Categorie.U8);
    ploeg.setNaam("Apllesiitos");
    ploegDB.toevoegenPloeg(ploeg);
    Persoon drie = new Persoon();
    drie.setVoornaam("Rubensito");
    drie.setNaam("Chulito");

    drie.setGeboortedatum(1998, 8, 1);

    drie.setTrainer(true);

    persoonDB.toevoegenPersoon(drie);

    ploeg = ploegDB.zoekPloeg(ploeg.getNaam());
    ploegDB.toevoegenTrainerPloeg(persoonDB.zoekPersoon("Chulito", "Rubensito"), ploeg);
  }
  @Test
  public void verwijderenPloegMetTrainer() throws Exception {
    Ploeg a = new Ploeg();
    a.setCategorie(Categorie.U9);
    a.setNaam("U7a");

    ploegDB.toevoegenPloeg(a);

    Persoon b = new Persoon();
    b.setTrainer(true);
    b.setGeboortedatum(1940, 4, 11);
    b.setNaam("Viernesito");
    b.setVoornaam("Vientesito");

    persoonDB.toevoegenPersoon(b);

    ploegDB.toevoegenTrainerPloeg(b, a);

    ploegDB.verwijderPloeg(a);
  }
  /**
   * deze methode koppelt de opgegeven speler aan de opgegeven ploeg
   *
   * @param ploegnaam De ploeg waaraan je een speler wilt koppelen.
   * @param persoon De persoon die je aan een ploeg wilt koppelen.
   * @throws DBException
   * @throws exception.ApplicationException
   */
  public void toevoegenSpelerPloeg(String ploegnaam, Persoon persoon)
      throws DBException, ApplicationException {
    Persoon p = persoonDB.zoekPersoon(persoon);
    // connectie tot stand brengen (en automatisch sluiten)
    try (Connection conn = ConnectionManager.getConnection(); ) {
      // preparedStatement opstellen (en automtisch sluiten)
      try (PreparedStatement stmt =
          conn.prepareStatement(
              "update persoon set ploeg_id=(select id from ploeg where naam=?) where id=?;"); ) {
        stmt.setString(1, ploegnaam);
        stmt.setInt(2, p.getId());

        stmt.execute();

      } catch (SQLException sqlEx) {
        throw new DBException(
            "SQL-exception in toevoegenSpelerPloeg(String naam,PersoonBag p) - statement" + sqlEx);
      }
    } catch (SQLException sqlEx) {
      throw new DBException(
          "SQL-exception in toevoegenSpelerPloeg(String naam,PersoonBag p) - connection" + sqlEx);
    }
  }
  // TODO add test methods here.
  // The methods must be annotated with annotation @Test. For example:
  //
  // @Test
  // public void hello() {}
  @Test
  public void toevoegenPloegMetTrainer() throws Exception {

    Persoon drie = new Persoon();
    drie.setVoornaam("Marnisito");
    drie.setNaam("Chulo");

    drie.setGeboortedatum(1989, 8, 1);

    drie.setTrainer(true);

    persoonDB.toevoegenPersoon(drie);

    Ploeg ploeg = new Ploeg();
    ploeg.setCategorie(Categorie.U6);
    ploeg.setNaam("las mamasitas");

    Persoon p = persoonDB.zoekPersoon(drie.getNaam(), drie.getVoornaam());
    ploeg.setTrainer(p.getId());

    ploegDB.toevoegenPloeg(ploeg);
  }
  /**
   * deze methode geeft een ArrayList terug waarin alle spelers van de opgegeven ploeg zitten
   *
   * @param id het id van de ploeg waarvan je alle spelers wilt opvragen
   * @return
   * @throws DBException
   */
  public ArrayList<Persoon> zoekSpelersPloeg(int id) throws DBException {

    ArrayList<Persoon> sp = new ArrayList<>();
    // connectie tot stand brengen (en automatisch sluiten)
    try (Connection conn = ConnectionManager.getConnection(); ) {
      // preparedStatement opstellen (en automtisch sluiten)
      try (PreparedStatement stmt =
          conn.prepareStatement(
              "select id, naam, voornaam, geboortedatum, isTrainer,ploeg_id from persoon where isTrainer=\"false\" and ploeg_id in(select id from ploeg where id=?)"); ) {
        stmt.setInt(1, id);
        // execute voert elke sql-statement uit, executeQuery enkel de eenvoudige
        stmt.execute();
        // result opvragen (en automatisch sluiten)
        try (ResultSet r = stmt.getResultSet()) {
          // van alle spelers uit de database Persoon-objecten maken

          while (r.next()) {
            Persoon k = new Persoon();
            k.setId(r.getInt("id"));
            k.setNaam(r.getString("naam"));
            k.setVoornaam(r.getString("voornaam"));
            k.setGeboortedatum(r.getDate("geboortedatum"));
            k.setTrainer(r.getBoolean("isTrainer"));
            if (r.getObject("ploeg_id") == null) {
              k.setPloegid(null);
            } else {
              k.setPloegid(r.getInt("ploeg_id"));
            }

            sp.add(k);
          }

          return sp;
        } catch (SQLException sqlEx) {
          throw new DBException("SQL-exception in zoekSpelersPloeg(int id) - resultset" + sqlEx);
        }
      } catch (SQLException sqlEx) {
        throw new DBException("SQL-exception in zoekSpelersPloeg(int id)n - statement" + sqlEx);
      }
    } catch (SQLException sqlEx) {
      throw new DBException("SQL-exception in zoekSpelersPloeg(int id) - connection" + sqlEx);
    }
  }
  @Test
  public void ontkoppelenSpeler() throws Exception {
    Persoon een = new Persoon();
    een.setVoornaam("stevisito");
    een.setNaam("rikisito");
    een.setGeboortedatum(1995, 4, 13);
    een.setTrainer(false);

    persoonDB.toevoegenPersoon(een);

    Ploeg ploeg = new Ploeg();
    ploeg.setCategorie(Categorie.U10);
    ploeg.setNaam("vivesito");

    ploegDB.toevoegenPloeg(ploeg);

    //
    ploegDB.toevoegenSpelerPloeg(
        ploegDB.zoekPloeg(ploeg.getNaam()),
        persoonDB.zoekPersoon(een.getNaam(), een.getVoornaam()));

    ploegDB.verwijderSpelerPloeg(een.getNaam(), een.getVoornaam());
  }
  @Test
  public void koppelenSpeler() throws Exception {
    Persoon een = new Persoon();
    een.setVoornaam("Davisito");
    een.setNaam("Claesito");
    een.setGeboortedatum(1960, 4, 12);

    Persoon twee = new Persoon();
    twee.setVoornaam("Cristinita");
    twee.setNaam("Claesita");
    twee.setGeboortedatum(1966, 5, 12);

    persoonDB.toevoegenPersoon(een);
    persoonDB.toevoegenPersoon(twee);

    Ploeg ploeg = new Ploeg();
    ploeg.setCategorie(Categorie.U11);
    ploeg.setNaam("aburido");

    ploegDB.toevoegenPloeg(ploeg);

    ploegDB.toevoegenSpelerPloeg(
        ploegDB.zoekPloeg(ploeg.getNaam()),
        persoonDB.zoekPersoon(een.getNaam(), een.getVoornaam()));

    ploegDB.toevoegenSpelerPloeg(
        ploegDB.zoekPloeg(ploeg.getNaam()),
        persoonDB.zoekPersoon(twee.getNaam(), twee.getVoornaam()));
  }
  /**
   * deze methode koppelt de opgegeven trainer aan de opgegeven ploeg
   *
   * @param persoon Het persoon object van de trainer die je wilt toevoegen.
   * @param ploeg Het ploeg object waraan je een trainer wilt toevoegen.
   * @throws DBException
   * @throws ApplicationException
   */
  public void toevoegenTrainerPloeg(Persoon persoon, Ploeg ploeg)
      throws DBException, ApplicationException {

    toevoegenTrainerPloeg(persoon.getNaam(), persoon.getVoornaam(), ploeg.getNaam());
  }
  /**
   * deze methode ontkoppelt de opgegeven speler van de ploegen waarin hij zit
   *
   * @param naam De naam van de speler die je wilt ontkoppelen
   * @param voornaam De voornaam van de speler die je wilt ontkoppelen
   * @throws DBException
   * @throws exception.ApplicationException
   */
  public void verwijderSpelerPloeg(String naam, String voornaam)
      throws DBException, ApplicationException {

    Persoon p = persoonDB.zoekPersoon(naam, voornaam);
    verwijderSpelerPloeg(p.getId());
  }
 /**
  * deze methode ontkoppelt de opgegeven speler aan de opgegeven ploeg
  *
  * @param p De speler die je wilt ontkoppelen
  * @throws DBException
  * @throws ApplicationException
  */
 public void verwijderSpelerPloeg(Persoon p) throws DBException, ApplicationException {
   verwijderSpelerPloeg(p.getNaam(), p.getVoornaam());
 }