package com.example.unodtantos.appqueology2.modelo;

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

import com.example.unodtantos.appqueology2.controlador.DbHelperUE;

/**
 * Created by unodtantos on 18/03/2015.
 */
public class DataBaseManagerUE {

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Atributos de la clase">

    public static final String TABLE_NAME_GENERAL = "tablaUEs";
    public static final String COLUM_NAME_ID_UE = "_id";
    public static final String COLUM_NAME_UE = "nombre_ue";
    public static final String COLUM_NAME_TIPO_UE = "tipoUe";
    public static final String COLUM_NAME_DESCRIPCION = "descripcion";
    public static final String COLUM_NAME_FECHA_CREACION_UE = "fechaCreacionUe";
    public static final String COLUM_NAME_DATACION_1 = "datacion_1";
    public static final String COLUM_NAME_DATACION_2 = "datacion_2";
    public static final String COLUM_NAME_NOMBRE_FOTO = "nombreFoto";
    public static final String COLUM_NAME_URL_FOTO = "urlFoto";
    public static final String COLUM_NAME_FECHA_FOTO = "fechaFoto";
    public static final String COLUM_NAME_LOCALIZACION = "localizacion";

    public static final String TABLE_NAME_PADRES = "tablaPadres";
    public static final String COLUM_NAME_ID_PADRE = "_id";
    public static final String COLUM_NAME_UE_PADRE = "nombre_ue_padre";

    private DbHelperUE helper;
    private SQLiteDatabase db;
    private Context context;
    private String nombre_p;

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Sentencias para crear las tablas">

    // Sentencia SQL (que crea la tabla con todas las ues)
    public static final String CREATE_TABLE_GENERAL = "create table " + TABLE_NAME_GENERAL + " ("
            + COLUM_NAME_ID_UE + " integer primary key autoincrement,"
            + COLUM_NAME_UE + " text unique not null,"
            + COLUM_NAME_TIPO_UE + " text,"
            + COLUM_NAME_DESCRIPCION + " text,"
            + COLUM_NAME_FECHA_CREACION_UE + " DATETIME DEFAULT CURRENT_TIMESTAMP,"
            + COLUM_NAME_DATACION_1 + " text,"
            + COLUM_NAME_DATACION_2 + " text,"
            + COLUM_NAME_NOMBRE_FOTO + " text,"
            + COLUM_NAME_URL_FOTO + " text,"
            + COLUM_NAME_FECHA_FOTO + " text,"
            + COLUM_NAME_LOCALIZACION + " text);";

    // Sentencia SQL (que crea la tabla con la relacion de ues y sus padres)
    public static final String CREATE_TABLE_PADRES = "create table " + TABLE_NAME_PADRES + " ("
            + COLUM_NAME_ID_PADRE + " integer primary key autoincrement,"
            + COLUM_NAME_UE + " integer,"
            + COLUM_NAME_UE_PADRE + " integer);";

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Constructor de la clase">

    /**
     * Constructor de la clase.
     * @param context
     * @param name
     */
    public DataBaseManagerUE(Context context, String name) {
        this.helper = new DbHelperUE(context, name);
        this.db = this.helper.getWritableDatabase();
        this.nombre_p=name;
        this.context=context;
    }

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Contenedores que permitiran guardar los datos tras consulta">

    /**
     * Método que se encarga de generar un contenedor donde se almacenarán los valores que
     * corresponden a cada una de las UEs almacenadas.
     * @param nombre
     * @param tipo_ue
     * @param descripcion
     * @param fecha_creacion_ue
     * @param datacion_1
     * @param datacion_2
     * @param nombre_foto
     * @param url_foto
     * @param fecha_foto
     * @param localizacion
     * @return
     */
    public ContentValues generarContentValuesUeActual(String nombre,  String tipo_ue, String descripcion, long fecha_creacion_ue, String datacion_1, String datacion_2, String nombre_foto, String url_foto, String fecha_foto, String localizacion){
        ContentValues valores = new ContentValues();
        valores.put(COLUM_NAME_UE, nombre);
        valores.put(COLUM_NAME_TIPO_UE, tipo_ue);
        valores.put(COLUM_NAME_DESCRIPCION, descripcion);
        valores.put(COLUM_NAME_DATACION_1, datacion_1);
        valores.put(COLUM_NAME_DATACION_2, datacion_2);
        valores.put(COLUM_NAME_NOMBRE_FOTO, nombre_foto);
        valores.put(COLUM_NAME_URL_FOTO, url_foto);
        valores.put(COLUM_NAME_FECHA_FOTO, fecha_foto);
        valores.put(COLUM_NAME_LOCALIZACION, localizacion);

        return valores;
    }

    /**
     * Método que genera el contenedor mencionado.
     * @param nom_ue_actual
     * @param nom_padre
     * @return
     */
    public ContentValues generarContentValuesUePadre(String nom_ue_actual, String nom_padre){
        ContentValues valores = new ContentValues();
        valores.put(COLUM_NAME_UE, nom_ue_actual);
        valores.put(COLUM_NAME_UE_PADRE, nom_padre);

        return valores;
    }

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Operaciones CRUD BBDD">

    /**
     * Método que permite insertar una nueva UE en la base de datos.
     * @param nombre
     * @param tipo_ue
     * @param descripcion
     * @param fecha_creacion_ue
     * @param datacion_1
     * @param datacion_2
     * @param nombre_foto
     * @param url_foto
     * @param fecha_foto
     * @param localizacion
     * @return
     */
    public long insertarUeActual(String nombre, String tipo_ue, String descripcion, String fecha_creacion_ue, String datacion_1, String datacion_2, String nombre_foto, String url_foto, String fecha_foto, String localizacion){
        return db.insert(TABLE_NAME_GENERAL,null,generarContentValuesUeActual(nombre, tipo_ue, descripcion, System.currentTimeMillis(), datacion_1, datacion_2, nombre_foto, url_foto, fecha_foto, localizacion));
    }

    /**
     * Método que permite insertar una nueva relación en la base de datos.
     * @param nom_ue_actual
     * @param nom_padre
     * @return
     */
    public long insertarPadre(String nom_ue_actual, String nom_padre) {
        return db.insert(TABLE_NAME_PADRES,null,generarContentValuesUePadre(nom_ue_actual, nom_padre));
    }

    /**
     * Método que permite hacer un select sobre la tabla de UEs.
     * @return
     */
    public Cursor cargarCursorUEs(){
        helper = new DbHelperUE(context,nombre_p);
        this.db = helper.getWritableDatabase();
        String[] columnas = new String[]{COLUM_NAME_ID_UE, COLUM_NAME_UE, COLUM_NAME_TIPO_UE, COLUM_NAME_DESCRIPCION, COLUM_NAME_FECHA_CREACION_UE, COLUM_NAME_DATACION_1, COLUM_NAME_DATACION_2, COLUM_NAME_NOMBRE_FOTO, COLUM_NAME_URL_FOTO, COLUM_NAME_FECHA_FOTO, COLUM_NAME_LOCALIZACION};
        return this.db.query(TABLE_NAME_GENERAL,columnas,null,null,null,null,null);
    }

    /**
     * Método que permite hacer un select sobre la tabla de relaciones.
     * @return
     */
    public Cursor cargarCursorUEsPadres() {

        String[] columnas = new String[]{COLUM_NAME_ID_PADRE, COLUM_NAME_UE, COLUM_NAME_UE_PADRE};
        return db.query(TABLE_NAME_PADRES,columnas,null,null,null,null,null);
    }

    /**
     * Método que permite eliminar una UE.
     * @param id
     * @return
     */
    public long eliminarUE(String id){
        return this.db.delete(TABLE_NAME_GENERAL, COLUM_NAME_ID_UE + "=" + id, null);
    }

    /**
     * Método que permite eliminar una UE por su ID.
     * @param id
     * @return
     */
    public long eliminarUePorId(String id) {
        return this.db.delete(TABLE_NAME_GENERAL, COLUM_NAME_ID_UE + "=" + id , null);
    }

    /**
     * Método que permite eliminar una relación a partir de su ID.
     * @param id
     * @return
     */
    public long eliminarPadrePorId(String id) {
        return this.db.delete(TABLE_NAME_PADRES, COLUM_NAME_ID_PADRE + "=" + id , null);
    }

    /**
     * Método que permite eliminar las tablas.
     * @param nombre_p
     */
    public void eliminarTablas(String nombre_p){
        db.execSQL("delete from "+ TABLE_NAME_PADRES);
        db.execSQL("delete from "+ TABLE_NAME_GENERAL);
    }

    /**
     * Método que permite actualizar los datos de una UE de la tabla de UEs.
     * @param nombre_ue
     * @param tipo_ue
     * @param descripcion
     * @param datacion_1
     * @param datacion_2
     * @param id
     * @return
     */
    public long actualizarDatosUeCentralParcial(String nombre_ue, String tipo_ue, String descripcion, String datacion_1, String datacion_2, String id){
        ContentValues valores = new ContentValues();
        valores.put(COLUM_NAME_TIPO_UE, tipo_ue);
        valores.put(COLUM_NAME_DESCRIPCION, descripcion);
        valores.put(COLUM_NAME_DATACION_1, datacion_1);
        valores.put(COLUM_NAME_DATACION_2, datacion_2);

        return this.db.update(TABLE_NAME_GENERAL, valores, COLUM_NAME_ID_UE + "=" + id, null);
    }

    /**
     * Método que permite actualizar los datos de una UE de la tabla de UEs.
     * @param nombre_ue
     * @param tipo_ue
     * @param descripcion
     * @param datacion_1
     * @param datacion_2
     * @param nombre_f
     * @param fecha_f
     * @param url_f
     * @param loc
     * @param id
     * @return
     */
    public long actualizarDatosUeCentralCompleto(String nombre_ue, String tipo_ue, String descripcion, String datacion_1, String datacion_2, String nombre_f, String fecha_f, String url_f, String loc, String id){
        ContentValues valores = new ContentValues();
        valores.put(COLUM_NAME_TIPO_UE, tipo_ue);
        valores.put(COLUM_NAME_DESCRIPCION, descripcion);
        valores.put(COLUM_NAME_DATACION_1, datacion_1);
        valores.put(COLUM_NAME_DATACION_2, datacion_2);
        valores.put(COLUM_NAME_NOMBRE_FOTO, nombre_f);
        valores.put(COLUM_NAME_FECHA_FOTO, fecha_f);
        valores.put(COLUM_NAME_URL_FOTO, url_f);
        valores.put(COLUM_NAME_LOCALIZACION, loc);

        return this.db.update(TABLE_NAME_GENERAL, valores, COLUM_NAME_ID_UE + "=" + id, null);
    }

    /**
     * Método que permite actualizar los datos de una UE de la tabla de UEs.
     * @param nombre_ue
     * @param punto
     * @param id
     * @return
     */
    public long actualizarGPS(String nombre_ue, String punto, String id){
        ContentValues valores = new ContentValues();
        valores.put(COLUM_NAME_LOCALIZACION, punto);

        return this.db.update(TABLE_NAME_GENERAL, valores, COLUM_NAME_ID_UE + "=" + id, null);
    }

    /**
     * Método que permite actualizar los datos de una UE de la tabla de UEs.
     * @param nombre_ue
     * @param nom_foto
     * @param fecha_foto
     * @param uri_foto
     * @param id
     * @return
     */
    public long actualizarFoto(String nombre_ue, String nom_foto, String fecha_foto, String uri_foto, String id){
        ContentValues valores = new ContentValues();
        valores.put(COLUM_NAME_NOMBRE_FOTO,nom_foto);
        valores.put(COLUM_NAME_FECHA_FOTO,fecha_foto);
        valores.put(COLUM_NAME_URL_FOTO,uri_foto);

        return this.db.update(TABLE_NAME_GENERAL, valores, COLUM_NAME_ID_UE + "=" + id, null);
    }

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/

    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">

    public static String getColumNameTipoUe() {
        return COLUM_NAME_TIPO_UE;
    }

    public static String getColumNameFechaCreacionUe() {
        return COLUM_NAME_FECHA_CREACION_UE;
    }

    public static String getColumNameDatacion1() {
        return COLUM_NAME_DATACION_1;
    }

    public static String getColumNameDatacion2() {
        return COLUM_NAME_DATACION_2;
    }

    public static String getColumNameNombreFoto() {
        return COLUM_NAME_NOMBRE_FOTO;
    }

    public static String getColumNameUrlFoto() {
        return COLUM_NAME_URL_FOTO;
    }

    public static String getColumNameFechaFoto() {
        return COLUM_NAME_FECHA_FOTO;
    }

    public static String getColumNameLocalizacion() {
        return COLUM_NAME_LOCALIZACION;
    }

    public static String getColumNameIdUe() {
        return COLUM_NAME_ID_UE;
    }

    public static String getColumNameUe() {
        return COLUM_NAME_UE;
    }

    public static String getColumNameDescripcion() {
        return COLUM_NAME_DESCRIPCION;
    }

    public static String getTableNamePadres() {
        return TABLE_NAME_PADRES;
    }

    public static String getColumNameIdPadre() {
        return COLUM_NAME_ID_PADRE;
    }

    public static String getColumNameUePadre() {
        return COLUM_NAME_UE_PADRE;
    }

    public static String getCreateTableGeneral() {
        return CREATE_TABLE_GENERAL;
    }

    public static String getCreateTablePadres() {
        return CREATE_TABLE_PADRES;
    }

    public static String getTableNameGeneral() {
        return TABLE_NAME_GENERAL;
    }

    // </editor-fold>

    /*--------------------------------------------------------------------------------------------*/
}
