﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Entidad;
using MySql.Data.MySqlClient;

namespace Dao
{
    public class FacturaDao
    {
        static String table = "factura";
        static String[] columns = { "fecha", "monto_total", "expediente_id" };

        public static void Insertar(FacturaEntidad factura, List<DetalleXFacturaEntidad> detalles)
        {
            String[] values = { factura.fecha.ToString("yyyy-MM-dd") + "", factura.monto + "", factura.expediente.id + "" };
            factura.id = Conexion.InsertarTransaccion(table, columns, values, null, null);

            foreach(DetalleXFacturaEntidad detalle in detalles)
            {
                detalle.id = factura.id.Value;
                Debug.WriteLine("El ID de la factura recien insertada es: " + detalle.id);
                DetalleXFacturaDAO.Insertar(detalle, Conexion.getConn(), Conexion.getTn());
            }

            Conexion.Commitear(Conexion.getTn());
            Conexion.CerrarConexion();
        }

        public static void Eliminar(FacturaEntidad factura)
        {
            Conexion.Eliminar(table, factura.id);
        }

        public static void Actualizar(FacturaEntidad factura)
        {
            String[] values = { factura.fecha.ToString("yyyy-MM-dd") + "", factura.expediente.id + "", factura.monto + "" };
            Conexion.Update(table, columns, values, factura.id);
        }


        public static List<FacturaEntidad> Listar()
        {
            List<FacturaEntidad> listActuaciones = new List<FacturaEntidad>();

            String[] columnas = { "id", "fecha", "monto_total", "expediente_id" };
            MySqlDataReader dr = Conexion.SeleccionSimple(table, columnas, "");
            while (dr.Read())
            {
                listActuaciones.Add(armarFactura(dr));
            }
            Conexion.CerrarConexion();

            return listActuaciones;
        }

        public static FacturaEntidad Obtener(int id)
        {
            String[] columnas = { "id", "fecha", "monto_total", "expediente_id" };
            MySqlDataReader dr = Conexion.SeleccionSimple(table, columnas, " id =" + id);
            FacturaEntidad a = new FacturaEntidad();
            while (dr.Read())
            {
                a = armarFactura(dr);
            }

            return a;
        }

        public static List<FacturaEntidad> Buscar(double? monto, String caratula, int? idExpediente, DateTime? fechaDesde, DateTime? fechaHasta, int? cliente)
        {
            //Datos especificos
            String[] columnas = { "f.id", "fecha", "expediente_id", "e.caratula as caratula_expediente", "monto_total", "c.id"};

            String[] joins = { " JOIN expediente e on expediente_id = e.id ", " JOIN cliente c on e.cliente_id = c.id " };

            List<FacturaEntidad> list = new List<FacturaEntidad>();
            StringBuilder clause = new StringBuilder(" 1=1 ");
            //Se agrega una condicion por cada parametro
            if (!string.IsNullOrWhiteSpace(caratula))
            {
                clause.Append(" AND e.caratula LIKE '%" + caratula + "%' ");
            }
            if (monto > 0)
            {
                clause.Append(" AND monto = " + monto );
            }
            if (idExpediente > 0)
            {
                clause.Append(" AND e.id = " + idExpediente);
            }
            if (fechaDesde.HasValue && fechaHasta.HasValue)
            {
                System.Diagnostics.Debug.WriteLine("**Existe un campo fecha de busqueda**");
                DateTime desde = (DateTime)fechaDesde.Value;
                DateTime hasta = (DateTime)fechaHasta.Value;
                clause.Append(" AND fecha BETWEEN '" + desde.ToString("yyyy-MM-dd") +"' AND '"+ hasta.ToString("yyyy-MM-dd")+"' ");
            }
            if (cliente != 0)
            {
                clause.Append(" AND c.id = " + cliente);
            }
            clause.Append(" ORDER BY fecha ");

            System.Diagnostics.Debug.WriteLine("La clausla de busqueda es: " + clause);
            MySqlDataReader dr = Conexion.SeleccionCompuesta(" factura f ", columnas, joins, clause.ToString());
            
            

            //Se agrega cada parametro a retornar
            while (dr.Read())
            {
                list.Add(armarFactura(dr));
            }

            return list;
        }

        private static FacturaEntidad armarFactura(MySqlDataReader dr)
        {
            FacturaEntidad f = new FacturaEntidad();
            f.id = int.Parse(dr["id"].ToString());
            f.monto = double.Parse(dr["monto_total"].ToString());
            f.fecha = Convert.ToDateTime(dr["fecha"].ToString());
            f.expediente = ExpedienteDao.Obtener(int.Parse(dr["expediente_id"].ToString()));
            

            return f;
        }
    }
}
