package com.vl;

import android.database.sqlite.*;
import android.database.Cursor;
import android.database.CursorIndexOutOfBoundsException;
import android.util.Log;
import android.content.Context;



// Klasse für die SQLite-Datenbank - kapselt Zugriff auf diesen Speicher
 // ansehen der Datenbank: adb -e shell; cd /data/data/com.vl/databases
 // sqlite3 verkaufsladen; .tables; .mode column; .header on
class VerkaufsladenDB
{
  private final String DB_NAME = "verkaufsladen";
  private SQLiteDatabase myDB = null;
  
  public VerkaufsladenDB(Context con)
  {
    Log.i("VL", "Konstruktor VerkaufsladenDB");
    anlegen(con);
  }

  // legt ggf. die Datenbank an sowie die Tabellen und einen Administraktor.
  // Die SQL-Anweisungen werden sicher mit catch behandelt
  private void anlegen(Context con)
  {
    // openOrCreateDatabase gehört zu android.content.Context, Activity ist davon abgeleitet
    try
    {
      myDB = con.openOrCreateDatabase(DB_NAME, SQLiteDatabase.CREATE_IF_NECESSARY,
      null);
      myDB.setMaximumSize(1000000);  // erstmal auf 1 MB begrenzen
    } 
    catch (SQLiteException ex) { Log.e("VL", ex.getMessage()); throw ex; }
    Log.i("VL", "Datenbank " + DB_NAME + " ist offen");

    // Tabellen anlegen - autoincrement braucht primary key, sonst SQLiteException
    /*
    Benutzer (_id, name, vorname, passwort)
    Artikel (_id, name, preis, anzahl, weg);
    Bestellung (_id, benutzer_id, artikel_id, stueckzahl, preis)
    Warenkorb (_id, benutzer_id, artikel_id, stueckzahl)
    */
    try
    {
      myDB.execSQL("CREATE TABLE IF NOT EXISTS benutzer (_id integer primary key autoincrement, vorname varchar(30), name varchar(30), passwort varchar(30));");
    } catch (SQLiteException ex) { Log.e("VL", ex.getMessage()); }
    try
    {
      myDB.execSQL("CREATE TABLE IF NOT EXISTS artikel (_id integer primary key autoincrement, name varchar(30), preis integer, anzahl integer, weg integer);"); 
    } catch (SQLiteException ex) { Log.e("VL", ex.getMessage()); }
    try
    {
      myDB.execSQL("CREATE TABLE IF NOT EXISTS bestellung (_id integer primary key autoincrement, benutzer_id integer, artikel_id integer, stueckzahl integer, preis integer);") ;
    } catch (SQLiteException ex) { Log.e("VL", ex.getMessage()); }
    try
    {
      myDB.execSQL("CREATE TABLE IF NOT EXISTS warenkorb (_id integer primary key autoincrement, benutzer_id integer, artikel_id integer, stueckzahl integer);") ;
    } catch (SQLiteException ex) { Log.e("VL", ex.getMessage()); }
    Log.i("VL", "die vier Tabellen sind vorhanden");
  }
  
  // siehe logcat:  E/Database: Leak found
  public void schliessen()
  {
    if (myDB != null) myDB.close();
    Log.i("VL", "Datenbank wieder geschlossen");
  }
  
  // Methoden für Administrator

  // legt neuen Benutzer(name) an
  public boolean benutzer_anlegen(String vorname, String nachname, String pw)
  {
    if (myDB == null) return false;
    try
    {
      myDB.execSQL("INSERT into benutzer (Vorname, Name, passwort) VALUES ('" + vorname + "','" + nachname + "','" + pw + "');");
      Log.i("VL", "Benutzer-Datensatz erstellt");
    }
    catch (SQLiteException ex) { return false; } 
    
    return true;  
  }

  // legt neuen Artikel(name,Preis,Anzahl an)
  public boolean artikel_anlegen(String bezeichnung, float preis, int anzahl)
  {
    if (myDB == null) return false;
    try
    {
      myDB.execSQL("INSERT into artikel (Name, Preis, Anzahl, weg) VALUES ('" + bezeichnung + "'," + preis + "," + anzahl + "," + 0 + ");");
      Log.i("VL", "Artikel-Datensatz erstellt");
    }
    catch (SQLiteException ex) { return false; } 
    
    return true;  
  }

  // Holt alle Eintraege aus Tabelle artikel
  public String [] alle_artikel_holen()
  {
    if (myDB == null) return null;
    Cursor cr = null;  // auch bei Fehler freigeben !
    String [] liste = null;
    try
    {
      String str [] = {"_id", "name"};
      cr = myDB.query("artikel", str , null, null, null, null,
      null, null);
      if (cr.moveToFirst())
      {
        int anz = cr.getCount(); liste = new String[anz];
        for (int i = 0; i < anz; ++i)
        {
          String teil = cr.getString(1) + " " + new Integer(cr.getInt(0));
          liste[i] = teil;
          if (!cr.moveToNext()) break;
        }
      }
      cr.close();
      Log.i("VL", "Artikel geholt");
    }
    catch (SQLiteException ex) { } 
    catch (CursorIndexOutOfBoundsException ex) { }
    
    return liste;  
  }
  
  // Löscht zu angeb. Tabelle den Datensatz; noch zu tun: SQL vorbereiten
  public boolean ds_loeschen (String tabelle, String id)
  {
    if (myDB == null || tabelle == null || id == null) return false;
    int rueck = -1;
    try
    {
      String args [] = {id};
      rueck = myDB.delete(tabelle, "_id=?", args);
      if (rueck == 1) Log.i("VL", "Eintrag gelöscht");
    }
    catch (SQLiteException ex) { return false; } 
    
    return (rueck == 1);    
  }

    
}

