package natumassas.natumassasapp.repositorios;

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

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

import natumassas.natumassasapp.entidades.Pedido;
import natumassas.natumassasapp.utils.QuickSortPedidos;

/**
 * @author Victor Carvalho
 * @since 16/09/2017
 */

public class PedidoRepositorio implements Repositorio{

    private SQLiteDatabase connection;

    public PedidoRepositorio(SQLiteDatabase connection){
        this.connection = connection;
    }

    @Override
    public void insert(Object o) {
        ContentValues contentValues = new ContentValues();

        Pedido pedido = (Pedido) o;

        contentValues.put("DATAENTREGA", pedido.getDataEntrega());
        contentValues.put("TITULO", pedido.titulo);
        contentValues.put("DESCRICAO", pedido.descricao);
        contentValues.put("VALOR", pedido.valor);
        contentValues.put("PAGO", pedido.pago);
        contentValues.put("CODCLIENTE", pedido.codCliente);

        connection.insertOrThrow("PEDIDO", "DESCRICAO", contentValues);
    }

    @Override
    public void delete(int codigo) {
        String[] param = new String[1];
        param[0] = String.valueOf(codigo);

        connection.delete("PEDIDO", "CODIGO = ?", param);
    }

    @Override
    public void update(Object o) {
        ContentValues contentValues = new ContentValues();

        Pedido pedido = (Pedido) o;

        contentValues.put("TITULO", pedido.titulo);
        contentValues.put("DATAENTREGA", pedido.getDataEntrega());
        contentValues.put("DESCRICAO", pedido.descricao);
        contentValues.put("VALOR", pedido.valor);
        contentValues.put("PAGO", pedido.pago);
        contentValues.put("CODCLIENTE", pedido.codCliente);

        String[] param = new String[1];
        param[0] = String.valueOf(pedido.codigo);

        connection.update("PEDIDO", contentValues, "CODIGO = ?", param);

    }

    public void finalizar(Pedido pedido) {
        ContentValues contentValues = new ContentValues();

        contentValues.put("FINALIZADO", 1);

        String[] param = new String[1];
        param[0] = String.valueOf(pedido.codigo);

        connection.update("PEDIDO", contentValues, "CODIGO = ?", param);

    }

    public void reabrir(Pedido pedido) {
        ContentValues contentValues = new ContentValues();

        contentValues.put("FINALIZADO", 0);

        String[] param = new String[1];
        param[0] = String.valueOf(pedido.codigo);

        connection.update("PEDIDO", contentValues, "CODIGO = ?", param);

    }

    @Override
    public Object search(int codigo) {
        Pedido pedido = new Pedido();

        StringBuilder sql = new StringBuilder();

        sql.append("SELECT  CODIGO, TITULO, DATAENTREGA, DESCRICAO, VALOR, PAGO, CODCLIENTE  ");
        sql.append("    FROM PEDIDO");
        sql.append("    WHERE CODIGO = ?");

        String[] param = new String[1];
        param[0] = String.valueOf(codigo);

        Cursor resultado = connection.rawQuery(sql.toString(), param);

        if(resultado.getCount() > 0){
            resultado.moveToFirst();

            pedido.codigo = resultado.getInt(resultado.getColumnIndexOrThrow("CODIGO"));
            pedido.titulo = resultado.getString(resultado.getColumnIndexOrThrow("TITULO"));
            pedido.setDataEntrega(resultado.getString(resultado.getColumnIndexOrThrow("DATAENTREGA")));
            pedido.descricao = resultado.getString(resultado.getColumnIndexOrThrow("DESCRICAO"));
            pedido.valor = resultado.getFloat(resultado.getColumnIndexOrThrow("VALOR"));
            pedido.pago = resultado.getInt(resultado.getColumnIndexOrThrow("PAGO"));
            pedido.codCliente = resultado.getInt(resultado.getColumnIndexOrThrow("CODCLIENTE"));

            return pedido;
        }

        resultado.close();
        return null;
    }

    public List<Object> searchAllSortedByActive() {
        List<Object> pedidos = new ArrayList<>();

        List<Pedido> pedidosAtivos = new ArrayList<>();
        List<Pedido> pedidosFinalizados = new ArrayList<>();

        StringBuilder sql = new StringBuilder();

        sql.append("SELECT  CODIGO, TITULO,FINALIZADO, DATAENTREGA, DESCRICAO, VALOR, PAGO, CODCLIENTE ");
        sql.append("    FROM PEDIDO");

        Cursor resultado = connection.rawQuery(sql.toString(), null);

        if(resultado.getCount() > 0){
            resultado.moveToFirst();

            do{
                Pedido pedido = new Pedido();

                pedido.codigo = resultado.getInt(resultado.getColumnIndexOrThrow("CODIGO"));
                pedido.titulo = resultado.getString(resultado.getColumnIndexOrThrow("TITULO"));
                pedido.finalizado = resultado.getInt(resultado.getColumnIndexOrThrow("FINALIZADO"));
                pedido.setDataEntrega(resultado.getString(resultado.getColumnIndexOrThrow("DATAENTREGA")));
                pedido.descricao = resultado.getString(resultado.getColumnIndexOrThrow("DESCRICAO"));
                pedido.valor = resultado.getFloat(resultado.getColumnIndexOrThrow("VALOR"));
                pedido.pago = resultado.getInt(resultado.getColumnIndexOrThrow("PAGO"));
                pedido.codCliente = resultado.getInt(resultado.getColumnIndexOrThrow("CODCLIENTE"));

                if(pedido.finalizado == 0)
                    pedidosAtivos.add(pedido);
                else
                    pedidosFinalizados.add(pedido);
            }
            while (resultado.moveToNext());
        }

        resultado.close();

        pedidosAtivos = QuickSortPedidos.sortAtivos(pedidosAtivos);
        pedidosFinalizados = QuickSortPedidos.sortFinalizados(pedidosFinalizados);

        pedidos.addAll(pedidosAtivos);
        pedidos.addAll(pedidosFinalizados);

        return pedidos;
    }

    @Override
    public List<Object> searchAll() {
        List<Object> pedidos = new ArrayList<>();

        StringBuilder sql = new StringBuilder();

        sql.append("SELECT  CODIGO, TITULO, DATAENTREGA, DESCRICAO, VALOR, PAGO, CODCLIENTE ");
        sql.append("    FROM PEDIDO");

        Cursor resultado = connection.rawQuery(sql.toString(), null);

        if(resultado.getCount() > 0){
            resultado.moveToFirst();

            do{
                Pedido pedido = new Pedido();

                pedido.codigo = resultado.getInt(resultado.getColumnIndexOrThrow("CODIGO"));
                pedido.titulo = resultado.getString(resultado.getColumnIndexOrThrow("TITULO"));
                pedido.setDataEntrega(resultado.getString(resultado.getColumnIndexOrThrow("DATAENTREGA")));
                pedido.descricao = resultado.getString(resultado.getColumnIndexOrThrow("DESCRICAO"));
                pedido.valor = resultado.getFloat(resultado.getColumnIndexOrThrow("VALOR"));
                pedido.pago = resultado.getInt(resultado.getColumnIndexOrThrow("PAGO"));
                pedido.codCliente = resultado.getInt(resultado.getColumnIndexOrThrow("CODCLIENTE"));

                pedidos.add(pedido);
            }
            while (resultado.moveToNext());
        }

        resultado.close();

        return pedidos;
    }
}