package com.example.martin.projetv5;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

/**
 * Created by martin on 21/02/2017.
 */

public class StringBDD {
    private static final String TABLE_EVENTS = "table_events";
    private static final String COL_ID_EV = "ID_ev";
    private static final int NUM_COL_ID_EV = 0;
    private static final String COL_DATE = "Date";
    private static final int NUM_COL_DATE = 1;
    private static final String COL_HEURE_EV = "Heure_ev";
    private static final int NUM_COL_HEURE_EV = 2;
    private static final String COL_EVENT = "Event";
    private static final int NUM_COL_EVENT = 3;

    private static final String TABLE_PRISES = "table_prises";
    private static final String COL_ID_P = "ID_prise";
    private static final int NUM_COL_ID_P = 0;
    private static final String COL_MEDOC = "Medoc";
    private static final int NUM_COL_MEDOC = 1;
    private static final String COL_HEURE = "Heure";
    private static final int NUM_COL_HEURE = 2;
    private static final String COL_BOOL = "Bool";
    private static final int NUM_COL_BOOL = 3;

    private static final String TABLE_MEDOCS = "table_medocs";
    private static final String COL_ID_M = "ID_medoc";
    private static final int NUM_COL_ID_M = 0;
    private static final String COL_NOM1 = "Nom1";
    private static final int NUM_COL_NOM1 = 1;
    private static final String COL_NOM2 = "Nom2";
    private static final int NUM_COL_NOM2 = 2;
    private static final String COL_POSO = "Posologies";
    private static final int NUM_COL_POSO = 3;
    private static final String COL_INFOS = "Indications";
    private static final int NUM_COL_INFOS = 4;
    private static final String COL_LOGO = "Logo";
    private static final int NUM_COL_LOGO = 5;

    private SQLiteDatabase bdd;

    private StringSQLite maBaseSQLite;

    private static final int VERSION_BDD = 1;

    public StringBDD(Context context) {
        maBaseSQLite = StringSQLite.getInstance(context);
    }

    public void open() {
        bdd = maBaseSQLite.getWritableDatabase();
    }

    public void close() {
        bdd.close();
    }

    public SQLiteDatabase getBDD() {
        return bdd;
    }

    //------- Gestion BDD event -----------

    public long insertEvent(Event ev) {
        //Création d'un ContentValues (fonctionne comme une HashMap)
        ContentValues values = new ContentValues();
        //on lui ajoute une valeur associée à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
        values.put(COL_ID_EV, ev.getId());
        values.put(COL_DATE, ev.getDate());
        values.put(COL_HEURE_EV, ev.getHeure());
        values.put(COL_EVENT, ev.getEvenement());
        //on insère l'objet dans la BDD via le ContentValues
        return bdd.insert(TABLE_EVENTS, null, values);
    }

    public int getIndiceMaxEvent(){
        Cursor c = bdd.rawQuery("select "+COL_ID_EV+" from "+TABLE_EVENTS,null);
        return c.getCount();
    }

    public Event getEventWithId(Integer id){
        //Récupère dans un Cursor les valeurs correspondant à une prise contenue dans la BDD (ici on sélectionne la prise grâce à son titre)
        Cursor c = bdd.query(TABLE_EVENTS, new String[] {COL_ID_EV, COL_DATE, COL_HEURE_EV, COL_EVENT}, COL_ID_EV + " LIKE \"" + id +"\"", null, null, null, null);
        return cursorToEvent(c);
    }

    //Cette méthode permet de convertir un cursor en une prise
    private Event cursorToEvent(Cursor c){
        //si aucun élément n'a été retourné dans la requête, on renvoie null
        if (c.getCount() == 0)
            return null;

        //Sinon on se place sur le premier élément
        c.moveToFirst();
        //On créé une prise
        Event ev = new Event(null,null,null,null);
        //on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
        ev.setId(c.getInt(NUM_COL_ID_EV));
        ev.setDate(c.getString(NUM_COL_DATE));
        ev.setHeure(c.getString(NUM_COL_HEURE_EV));
        ev.setEvenement(c.getString(NUM_COL_EVENT));
        //On ferme le cursor
        c.close();

        //On retourne la prise
        return ev;
    }

    //------- Gestion BDD prises -----------

    public long insertPrise(Prise2 prise){
        //Création d'un ContentValues (fonctionne comme une HashMap)
        ContentValues values = new ContentValues();
        //on lui ajoute une valeur associée à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
        values.put(COL_ID_P,prise.getId());
        values.put(COL_MEDOC, prise.getIdMedoc());
        values.put(COL_HEURE, prise.getHeure());
        values.put(COL_BOOL, prise.getEffectuee());
        //on insère l'objet dans la BDD via le ContentValues
        return bdd.insert(TABLE_PRISES, null, values);
    }

    public int updatePrise(int id, Prise2 prise){
        //La mise à jour d'une prise dans la BDD fonctionne plus ou moins comme une insertion
        //il faut simplement préciser quelle prise on doit mettre à jour grâce à l'ID
        ContentValues values = new ContentValues();
        values.put(COL_ID_P, prise.getId());
        values.put(COL_MEDOC, prise.getIdMedoc());
        values.put(COL_HEURE, prise.getHeure());
        values.put(COL_BOOL, prise.getEffectuee());
        return bdd.update(TABLE_PRISES, values, COL_ID_P + " = " +id, null);
    }

    public int removePriseWithID(int id){
        //Suppression d'une prise de la BDD grâce à l'ID
        return bdd.delete(TABLE_PRISES, COL_ID_P + " = " +id, null);
    }

    public Prise2 getPriseWithId(Integer id){
        //Récupère dans un Cursor les valeurs correspondant à une prise contenue dans la BDD (ici on sélectionne la prise grâce à son titre)
        Cursor c = bdd.query(TABLE_PRISES, new String[] {COL_ID_P, COL_MEDOC, COL_HEURE, COL_BOOL}, COL_ID_P + " LIKE \"" + id +"\"", null, null, null, null);
        return cursorToPrise(c);
    }

    public int getIndiceMaxPrise(){
        Cursor c = bdd.rawQuery("select "+COL_ID_P+" from "+TABLE_PRISES,null);
        return c.getCount();
    }

    //Cette méthode permet de convertir un cursor en une prise
    private Prise2 cursorToPrise(Cursor c){
        //si aucun élément n'a été retourné dans la requête, on renvoie null
        if (c.getCount() == 0)
            return null;

        //Sinon on se place sur le premier élément
        c.moveToFirst();
        //On créé une prise
        Prise2 prise = new Prise2(null,null,null,null);
        //on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
        prise.setId(c.getInt(NUM_COL_ID_P));
        prise.setIdMedoc(c.getInt(NUM_COL_MEDOC));
        prise.setHeure(c.getString(NUM_COL_HEURE));
        prise.setEffectuee(c.getString(NUM_COL_BOOL));
        //On ferme le cursor
        c.close();

        //On retourne la prise
        return prise;
    }

    //------- Gestion BDD medocs -----------

    public long insertMedoc(Medicament medicament){
        //Création d'un ContentValues (fonctionne comme une HashMap)
        ContentValues values = new ContentValues();
        //on lui ajoute une valeur associée à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
        values.put(COL_ID_M, medicament.getIdM());
        values.put(COL_NOM1, medicament.getNom1());
        values.put(COL_NOM2, medicament.getNom2());
        values.put(COL_POSO, medicament.getPosologies());
        values.put(COL_INFOS, medicament.getIndications());
        values.put(COL_LOGO, medicament.getLogo());
        //on insère l'objet dans la BDD via le ContentValues
        return bdd.insert(TABLE_MEDOCS, null, values);
    }

    public int updateMedoc(int id, Medicament medicament){
        //La mise à jour d'une prise dans la BDD fonctionne plus ou moins comme une insertion
        //il faut simplement préciser quelle prise on doit mettre à jour grâce à l'ID
        ContentValues values = new ContentValues();
        values.put(COL_ID_M, medicament.getIdM());
        values.put(COL_NOM1, medicament.getNom1());
        values.put(COL_NOM2, medicament.getNom2());
        values.put(COL_POSO, medicament.getPosologies());
        values.put(COL_INFOS, medicament.getIndications());
        values.put(COL_LOGO, medicament.getLogo());
        return bdd.update(TABLE_MEDOCS, values, COL_ID_M + " = " +id, null);
    }

    public Medicament getMedocWithId(Integer id){
        //Récupère dans un Cursor les valeurs correspondant à une prise contenue dans la BDD (ici on sélectionne la prise grâce à son titre)
        Cursor c = bdd.query(TABLE_MEDOCS, new String[] {COL_ID_M, COL_NOM1, COL_NOM2, COL_POSO, COL_INFOS, COL_LOGO}, COL_ID_M + " LIKE \"" + id +"\"", null, null, null, null);
        return cursorToMedoc(c);
    }

    public Medicament getMedocWithNom1(String nom){
        //Récupère dans un Cursor les valeurs correspondant à une prise contenue dans la BDD (ici on sélectionne la prise grâce à son titre)
        Cursor c = bdd.query(TABLE_MEDOCS, new String[] {COL_ID_M, COL_NOM1, COL_NOM2, COL_POSO, COL_INFOS, COL_LOGO}, COL_NOM1 + " LIKE \"" + nom +"\"", null, null, null, null);
        return cursorToMedoc(c);
    }

    public int getIndiceMaxMedoc(){
        Cursor c = bdd.rawQuery("select "+COL_ID_M+" from "+TABLE_MEDOCS,null);
        return c.getCount();
    }

    private Medicament cursorToMedoc(Cursor c){
        //si aucun élément n'a été retourné dans la requête, on renvoie null
        if (c.getCount() == 0)
            return null;

        //Sinon on se place sur le premier élément
        c.moveToFirst();
        //On créé une prise
        Medicament medicament = new Medicament(null,null,null,null,null,null);
        //on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
        medicament.setIdM(c.getInt(NUM_COL_ID_M));
        medicament.setNom1(c.getString(NUM_COL_NOM1));
        medicament.setNom2(c.getString(NUM_COL_NOM2));
        medicament.setPosologies(c.getString(NUM_COL_POSO));
        medicament.setIndications(c.getString(NUM_COL_INFOS));
        medicament.setLogo(c.getString(NUM_COL_LOGO));
        //On ferme le cursor
        c.close();

        //On retourne la prise
        return medicament;
    }
}
