/**
   * Metodilla haetaan käyttäjän ostoslistoja, joiden ostokset on tehty annetussa kaupassa.
   *
   * @param hakukauppa kauppa, jossa ostokset on tehty.
   * @param kayttaja ostoslistan luoneen käyttäjän id tietokannassa.
   * @throws Exception
   * @return palauttaa listan ostoslistoista, jotka löytyvät hakuehdoilla.
   */
  public static List<OstoslistaKuitattu> haeOstoslistaKuitattuKaupalla(int hakukauppa, int kayttaja)
      throws Exception {
    Connection yhteys = null;
    PreparedStatement kysely = null;
    ResultSet tulokset = null;

    List<OstoslistaKuitattu> ostoslistat = new ArrayList<OstoslistaKuitattu>();

    try {
      String sql =
          "SELECT * FROM shoppinglistchecked WHERE shop_id = ? AND account_id = ? ORDER BY time_checked";
      yhteys = Yhteys.getYhteys();
      kysely = yhteys.prepareStatement(sql);
      kysely.setInt(1, hakukauppa);
      kysely.setInt(2, kayttaja);
      tulokset = kysely.executeQuery();

      if (tulokset.next()) {
        while (tulokset.next()) {
          OstoslistaKuitattu o =
              new OstoslistaKuitattu(
                  tulokset.getInt("shoppinglistchecked_id"),
                  tulokset.getInt("shoppinglist_id"),
                  tulokset.getString("name"),
                  tulokset.getDouble("sum"),
                  tulokset.getDouble("weight"),
                  tulokset.getTimestamp("time_checked"),
                  Kauppa.haeKauppa(tulokset.getInt("shop_id")),
                  tulokset.getInt("account_id"),
                  Maksutapa.haeMaksutapa(tulokset.getInt("payment_id")),
                  Bonus.haeBonus(tulokset.getInt("bonus_id")));
          ostoslistat.add(o);
        }
      } else {
        return null;
      }

      return ostoslistat;

    } finally {
      try {
        tulokset.close();
      } catch (Exception e) {
      }
      try {
        kysely.close();
      } catch (Exception e) {
      }
      try {
        yhteys.close();
      } catch (Exception e) {
      }
    }
  }
 private OstoslistaKuitattu(ResultSet tulos) throws SQLException, Exception {
   OstoslistaKuitattu o =
       new OstoslistaKuitattu(
           tulos.getInt("shoppinglistchecked_id"),
           tulos.getInt("shoppinglist_id"),
           tulos.getString("name"),
           tulos.getDouble("sum"),
           tulos.getDouble("weight"),
           tulos.getTimestamp("time_checked"),
           Kauppa.haeKauppa(tulos.getInt("shop_id")),
           tulos.getInt("account_id"),
           Maksutapa.haeMaksutapa(tulos.getInt("payment_id")),
           Bonus.haeBonus(tulos.getInt("bonus_id")));
 }
  /**
   * Metodilla haetaan ostoslista sen id:llä.
   *
   * @param id ostoslistan id tietokannassa.
   * @throws Exception
   * @return palauttaa id:tä vastaavan ostoslistan.
   */
  public static OstoslistaKuitattu haeOstoslistaKuitattu(int id) throws Exception {
    Connection yhteys = null;
    PreparedStatement kysely = null;
    ResultSet tulokset = null;

    try {
      String sql = "SELECT * FROM shoppinglistchecked WHERE shoppinglistchecked_id = ?";
      yhteys = Yhteys.getYhteys();
      kysely = yhteys.prepareStatement(sql);
      kysely.setInt(1, id);
      tulokset = kysely.executeQuery();

      if (tulokset.next()) {
        OstoslistaKuitattu o =
            new OstoslistaKuitattu(
                tulokset.getInt("shoppinglistchecked_id"),
                tulokset.getInt("shoppinglist_id"),
                tulokset.getString("name"),
                tulokset.getDouble("sum"),
                tulokset.getDouble("weight"),
                tulokset.getTimestamp("time_checked"),
                Kauppa.haeKauppa(tulokset.getInt("shop_id")),
                tulokset.getInt("account_id"),
                Maksutapa.haeMaksutapa(tulokset.getInt("payment_id")),
                Bonus.haeBonus(tulokset.getInt("bonus_id")));
        return o;
      } else {
        return null;
      }

    } finally {
      try {
        tulokset.close();
      } catch (Exception e) {
      }
      try {
        kysely.close();
      } catch (Exception e) {
      }
      try {
        yhteys.close();
      } catch (Exception e) {
      }
    }
  }
  /**
   * Metodilla tallennetaan Ostoslista - olio.
   *
   * @throws Exception
   * @return palauttaa true, jos tallennus onnistui.
   */
  public boolean tallenna() throws Exception {
    Connection yhteys = null;
    PreparedStatement kysely = null;
    ResultSet tulokset = null;

    try {
      String sql =
          "INSERT INTO shoppinglistchecked(shoppinglist_id, name, sum, weight, time_checked, "
              + "shop_id, account_id, payment_id, bonus_id) VALUES(?,?,?,?,?,?,?,?,?) RETURNING shoppinglistchecked_id";
      yhteys = Yhteys.getYhteys();
      kysely = yhteys.prepareStatement(sql);
      kysely.setInt(1, listaid);
      kysely.setString(2, nimi);
      kysely.setDouble(3, summa);
      kysely.setDouble(4, paino);
      kysely.setTimestamp(5, paivays);
      kysely.setInt(6, kauppa.getId());
      kysely.setInt(7, kayttajaId);
      kysely.setInt(8, maksutapa.getId());
      kysely.setInt(9, bonus.getId());
      tulokset = kysely.executeQuery();

      if (tulokset.next()) {
        id = tulokset.getInt("shoppinglistchecked_id");
        return true;
      } else {
        return false;
      }

    } finally {
      try {
        tulokset.close();
      } catch (Exception e) {
      }
      try {
        kysely.close();
      } catch (Exception e) {
      }
      try {
        yhteys.close();
      } catch (Exception e) {
      }
    }
  }
  /**
   * Metodilla haetaan kaikki käyttäjän ostoslistat.
   *
   * @param hakukayttaja käyttäjän id tietokannassa.
   * @throws SQLException
   * @throws NamingException
   * @return palauttaa listana käyttäjän kaikki ostoslistat.
   */
  public static List<OstoslistaKuitattu> haeKaikkiOstoslistaKuitattu(int hakukayttaja)
      throws SQLException, NamingException, Exception {
    String sql =
        "SELECT shoppinglistchecked_id, shoppinglist_id, name, sum, weight, to_char(time_checked, 'YYYY-MM-DD HH24:MI:SS') as time_checked,"
            + " shop_id, account_id, payment_id, bonus_id FROM shoppinglistchecked WHERE account_id = ? ORDER BY time_checked";
    Connection yhteys = Yhteys.getYhteys();
    PreparedStatement kysely = yhteys.prepareStatement(sql);
    kysely.setInt(1, hakukayttaja);
    ResultSet tulokset = kysely.executeQuery();

    ArrayList<OstoslistaKuitattu> ostoslistat = new ArrayList<OstoslistaKuitattu>();
    while (tulokset.next()) {
      OstoslistaKuitattu o =
          new OstoslistaKuitattu(
              tulokset.getInt("shoppinglistchecked_id"),
              tulokset.getInt("shoppinglist_id"),
              tulokset.getString("name"),
              tulokset.getDouble("sum"),
              tulokset.getDouble("weight"),
              tulokset.getTimestamp("time_checked"),
              Kauppa.haeKauppa(tulokset.getInt("shop_id")),
              tulokset.getInt("account_id"),
              Maksutapa.haeMaksutapa(tulokset.getInt("payment_id")),
              Bonus.haeBonus(tulokset.getInt("bonus_id")));
      ostoslistat.add(o);
    }

    try {
      tulokset.close();
    } catch (Exception e) {
    }
    try {
      kysely.close();
    } catch (Exception e) {
    }
    try {
      yhteys.close();
    } catch (Exception e) {
    }

    return ostoslistat;
  }