package com.miguel.amm.simplesqlite;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    //Declaramos los objetos de interfaz a utilizar
    Button btnBuscar, btnInsertar, btnActualizar, btnBorrar, btnClear, btnAll;
    EditText etId, etNombre, etApellidos;
    ListView lvPersonas;
    RadioButton rbId, rbNombre, rbApellidos;
    RadioGroup rgBuscar;
    ArrayList<String> alPersonas;

    //Declaramos la clase DBHelpber
    DBHelper dbHelper;

    //*****************************************************
    // onCreate Inicialización de la Activity.
    //*****************************************************
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Implementamos (asignamos) los objetos de interfaz
        btnBuscar=(Button) findViewById(R.id.btnBuscar);
        btnInsertar=(Button) findViewById(R.id.btnInsertar);
        btnActualizar=(Button) findViewById(R.id.btnActualizar);
        btnBorrar=(Button) findViewById(R.id.btnBorrar);
        btnClear=(Button) findViewById(R.id.btnClear);
        btnAll=(Button) findViewById(R.id.btnAll);

        rgBuscar = (RadioGroup) findViewById(R.id.rgBuscar);
        rbId = (RadioButton) findViewById(R.id.rbId);
        rbNombre = (RadioButton) findViewById(R.id.rbNombre);
        rbApellidos = (RadioButton) findViewById(R.id.rbApellidos);
        rbNombre.setChecked(true);

        etId=(EditText) findViewById(R.id.etId);
        etNombre=(EditText) findViewById(R.id.etNombre);
        etApellidos=(EditText) findViewById(R.id.etApellidos);

        lvPersonas=(ListView) findViewById(R.id.lvPersonas);
        //Ahora Establecemos el onItemClickListener para nuestro ListView y respondemos al evento onItemClick
        lvPersonas.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                String strId = Integer.toString(i+1);
                etId.setText(strId);
                rbId.setChecked(true);
                DoBuscar();
            }
        });

        //Asignamos this como OnClickListener de los buttons
        btnBuscar.setOnClickListener(this);
        btnInsertar.setOnClickListener(this);
        btnActualizar.setOnClickListener(this);
        btnBorrar.setOnClickListener(this);
        btnClear.setOnClickListener(this);
        btnAll.setOnClickListener(this);

        //Instanciamos la clase DBHelper
        dbHelper = new DBHelper(this);

        alPersonas=new ArrayList<String>();

    }

    //*****************************************************
    // onClick callBack para los buttons
    //*****************************************************
    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.btnClear:
                ClearInput();
                ClearList();
                break;
            case R.id.btnAll:
                ClearList();
                LoadAll();
                break;
            case R.id.btnBuscar:
                DoBuscar();
                break;
            case R.id.btnInsertar:
                if (DoInsertar()){
                    ClearList();
                    LoadAll();
                }
                break;
            case R.id.btnActualizar:
                if (DoActualizar()){
                    ClearList();
                    LoadAll();
                }
                break;
            case R.id.btnBorrar:
                if (DoBorrar()){
                    ClearInput();
                    ClearList();
                    LoadAll();
                }
                break;
            default:
                break;
        }
    }

    //*****************************************************
    // Obtiene todos los registros de la base de datos
    // y carga el ListView con ellos.
    //*****************************************************
    private void LoadAll(){
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        String strId, strNombre, strApellidos, strPersona;

        //ESTA ES OTRA FORMA MÁS DIRECTA DE CREAR EL CURSOR PARA OBTENER LO MISMO.
        //Cursor  cursor = db.rawQuery("select * from "+ DBSchema.Personas.TABLE_NAME,null);

        String[] projection = {
                DBSchema.Personas.COL_ID,
                DBSchema.Personas.COL_NOMBRE,
                DBSchema.Personas.COL_APELLIDOS};

        // How you want the results sorted in the resulting Cursor
        String sortOrder =  DBSchema.Personas.COL_ID + " ASC";

        Cursor cursor = db.query(
                DBSchema.Personas.TABLE_NAME,   // The table to query
                projection,            // The array of columns to return (pass null to get all)
                null,         // The columns for the WHERE clause
                null,     // The values for the WHERE clause
                null,         // don't group the rows
                null,          // don't filter by row groups
                sortOrder);             // The sort order

        while(cursor.moveToNext()) {
            strId= cursor.getString(cursor.getColumnIndexOrThrow(DBSchema.Personas.COL_ID));
            strNombre= cursor.getString(cursor.getColumnIndexOrThrow(DBSchema.Personas.COL_NOMBRE));
            strApellidos=cursor.getString(cursor.getColumnIndexOrThrow(DBSchema.Personas.COL_APELLIDOS));
            strPersona="("+ strId+") "+ strNombre + " " + strApellidos;
            alPersonas.add(strPersona);
        }
        cursor.close();

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,alPersonas);

        //Ahora vinculamos el listView con el nuevo adapter
        lvPersonas.setAdapter(adapter);
    }

    //*****************************************************
    // Busca la entrada de la base de datos y caga los editText
    //*****************************************************
    private void DoBuscar(){
        //En esta versión solo buscamos por Id.
        //Comprobamos que el campo está lleno.

        int iId=-1;
        String strId, strNombre, strApellidos;
        Boolean doQuery=true;

        SQLiteDatabase db = dbHelper.getReadableDatabase();

        // Define a projection that specifies which columns from the database
        // you will actually use after this query.
        String[] projection = {
                DBSchema.Personas.COL_ID,
                DBSchema.Personas.COL_NOMBRE,
                DBSchema.Personas.COL_APELLIDOS
        };

        //Determinamos cual es el campo por el que buscar, según el checked de los readiobuttons
        //Determinamos la selection
        String selection = null;
        String[] selectionArgs={};
        switch (rgBuscar.getCheckedRadioButtonId()){
            case (R.id.rbId):
                try {
                    strId = etId.getText().toString();
                    iId = Integer.parseInt(strId);
                    if (iId<0) {
                        Toast.makeText(this, "El Id debe ser >=0", Toast.LENGTH_SHORT).show();
                        doQuery=false;
                    }
                    else{ //Preparamos los argumentos de la query
                        selection = DBSchema.Personas.COL_ID + " = ?";
                        selectionArgs = new String[]{strId};
                    }
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                    Toast.makeText(this, "El id debe ser un numero entero >= 0", Toast.LENGTH_SHORT).show();
                    doQuery=false;
                }
                break;
            case (R.id.rbNombre):
                if (etNombre.getText().toString().isEmpty()){
                    Toast.makeText(this, "Introduce un nombre a buscar.", Toast.LENGTH_SHORT).show();
                    doQuery = false;
                }
                else  {//Preparamos los argumentos de la query
                    strNombre = etNombre.getText().toString();
                    selection = DBSchema.Personas.COL_NOMBRE + " LIKE ?";
                    selectionArgs = new String[]{"%"+strNombre+"%"};
                }
                break;
            case (R.id.rbApellidos):
                if (etApellidos.getText().toString().isEmpty()){
                    Toast.makeText(this, "Introduce un apellido a buscar.", Toast.LENGTH_SHORT).show();
                    doQuery = false;
                }
                else {
                    strApellidos = etApellidos.getText().toString();
                    selection = DBSchema.Personas.COL_APELLIDOS + " LIKE ?";
                    selectionArgs = new String[]{"%"+strApellidos+"%"};
                }
                break;
        }

        if (doQuery) {
            // How you want the results sorted in the resulting Cursor
    //        String sortOrder =
    //                FeedEntry.COLUMN_NAME_SUBTITLE + " DESC";

//            SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
//            qb.setTables(DBSchema.Personas.TABLE_NAME);
//            String sql = qb.buildQuery(projection, selection, null, null, null, null);

            Cursor cursor = db.query(
                    DBSchema.Personas.TABLE_NAME,   // The table to query
                    projection,             // The array of columns to return (pass null to get all)
                    selection,              // The columns for the WHERE clause
                    selectionArgs,          // The values for the WHERE clause
                    null,                   // don't group the rows
                    null,                   // don't filter by row groups
                    null               // The sort order
            );

            //Colocamos el cursor en la primera ocurrencia. Si existe ha encontrado el elmento.
            try {
                cursor.moveToFirst();
                etId.setText(cursor.getString(0));
                etNombre.setText(cursor.getString(1));
                etApellidos.setText(cursor.getString(2));
                Toast.makeText(this, "Busqueda correcta", Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                Toast.makeText(this, "No encontrado", Toast.LENGTH_SHORT).show();
            }
        }
    }

    //*****************************************************
    // Inserta la entrada en la base de datos
    //*****************************************************
    private boolean DoInsertar(){
        // Gets the data repository in write mode
        SQLiteDatabase db = dbHelper.getWritableDatabase();

        // Create a new map of values, where column names are the keys
        ContentValues values = new ContentValues();
        values.put(DBSchema.Personas.COL_ID, etId.getText().toString() );
        values.put(DBSchema.Personas.COL_NOMBRE, etNombre.getText().toString());
        values.put(DBSchema.Personas.COL_APELLIDOS, etApellidos.getText().toString());

        // Insert the new row, returning the primary key value of the new row
        long newRowId = db.insert(DBSchema.Personas.TABLE_NAME, null, values);

        if (newRowId==-1){
            Toast.makeText(this, "El registro ya existe", Toast.LENGTH_SHORT).show();
            return false;
        }else {
            Toast.makeText(this, "Registro Insertado", Toast.LENGTH_SHORT).show();
            return true;
        }
    }

    //*****************************************************
    // Actualiza la entrada en la base de datos
    //*****************************************************
    private boolean DoActualizar(){
        SQLiteDatabase db = dbHelper.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(DBSchema.Personas.COL_NOMBRE, etNombre.getText().toString());
        values.put(DBSchema.Personas.COL_APELLIDOS, etApellidos.getText().toString());

        // Which row to update, based on the title
        String selection = DBSchema.Personas.COL_ID + " LIKE ?";
        String[] selectionArgs = { etId.getText().toString() };

        int count = db.update(DBSchema.Personas.TABLE_NAME,values,
                              selection,selectionArgs);

        if (count==1) {
            Toast.makeText(this, "Registro Actualizado", Toast.LENGTH_SHORT).show();
            return true;
        }else{
            Toast.makeText(this, "Registro no encontrado", Toast.LENGTH_SHORT).show();
            return false;
        }
    }

    //*****************************************************
    // Borra la entrada de la base de datos
    //*****************************************************
    private boolean DoBorrar(){
        SQLiteDatabase db = dbHelper.getWritableDatabase();

        // Define 'where' part of query.
        String selection = DBSchema.Personas.COL_ID + " LIKE ?";
        // Specify arguments in placeholder order.
        String[] selectionArgs = { etId.getText().toString() };
        // Issue SQL statement.
        int deletedRows = db.delete(DBSchema.Personas.TABLE_NAME, selection, selectionArgs);
        
        if (deletedRows==0){
            Toast.makeText(this,"Registro no encontrado", Toast.LENGTH_SHORT).show();
            return false;
        }
        else{
            Toast.makeText(this,"Registro Borrado", Toast.LENGTH_SHORT).show();
            return true;
        }

    }

    //*****************************************************
    // Borrar el contenido de los campos de entrada
    //*****************************************************
    private void ClearInput(){
        etId.setText("");
        etNombre.setText("");
        etApellidos.setText("");
    }

    //*****************************************************
    // Borrar el contenido del ListView que contiene los nombres
    //*****************************************************
    private void ClearList(){
        alPersonas.clear();
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, alPersonas);
        //Ahora vinculamos el listView con el nuevo adapter
        lvPersonas.setAdapter(adapter);
    }

    //*****************************************************
    // Ocultar el teclado virtual
    //*****************************************************
    private void HideKeyboard(View view) {
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
    }

    @Override
    protected void onDestroy() {
        dbHelper.close();
        super.onDestroy();
    }


}
