using Dapper;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SQLite;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QueueSys
{
    public class CustomerView
    {
        public string Customer { get; }
        public string Status { get; }
    }

    public class ReportView
    {
        public int id { get; }
        public string customer_name { get; set; }
        public int num_bags { get; set; }
        public string employee { get; set; }
        public int status { get; set; }
        public string start_time { get; set; }
        public string end_time { get; set; }
        public string time_elapsed { get; set; }
    }

    public class EmployeeView
    {
        public int id { get; set; }
        public string customer_name { get; set; }
    }
    public class StatusModel
    {
        public string status { get; set; }
    }

    public class SqliteDataAccess
    {
        public List<EmployeeView> LoadEmployeeView()
        {
            //A using statement protects us as a failsafe: it guarantees the connection to the
            //database will be closed, even in event of an application or computer crash.
            using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString()))
            {
                string strQuery = "SELECT id,customer_name FROM active_customers;";

                var output = cnn.Query<EmployeeView>(strQuery, new DynamicParameters());
                return output.ToList();
            }
         }

        public List<StatusModel> GetCxStatus(int customer_id)
        {
            using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString()))
            {
                string strQuery = "SELECT status_lookup.status FROM active_customers INNER JOIN status_lookup on active_customers.status_id=status_lookup.status_id WHERE id=@id;";

                var output = cnn.Query<StatusModel>(strQuery, new { id = customer_id });

                return output.ToList();
            }
        }

        public List<CustomerView> LoadCustomerView()
        {
            using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString()))
            {
                string strQuery = "SELECT customer_name as Customer,status_lookup.status as Status FROM active_customers INNER JOIN status_lookup on active_customers.status_id=status_lookup.status_id ORDER BY active_customers.status_id";

                var output = cnn.Query<CustomerView>(strQuery, new DynamicParameters());
                return output.ToList();
            }
        }

        public void SaveCustomer(ReportView customer)
        {
            using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString()))
            {
                string strQuery = "INSERT INTO active_customers (customer_name, num_bags, employee, status_id) VALUES (@customer_name, @num_bags, @employee, 3)";
                cnn.Execute(strQuery, customer);
            }
        }
         
        public void ArchiveCustomer(EmployeeView customer)
        {
            using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString()))
            {
                string strQuery = "INSERT INTO archive(id, customer_name,num_bags,employee,status_id,start_time) SELECT id,customer_name,num_bags,employee,status_id,start_time FROM active_customers WHERE id=@id";
                cnn.Execute(strQuery, customer);
               
                strQuery = "DELETE FROM active_customers WHERE id=@id";
                cnn.Execute(strQuery, customer);
            }
        }

        public List<StatusModel> LoadStatusStrings()
        {
            using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString()))
            {
                string strQuery = "SELECT status FROM status_lookup";

                var output = cnn.Query<StatusModel>(strQuery, new DynamicParameters());
                return output.ToList();
            }
        }

        public void UpdateCustomerStatus(int customer_id_in, string status_in)
        {
            using (IDbConnection cnn = new SQLiteConnection(LoadConnectionString()))
            {
                string strQuery = "UPDATE active_customers SET status_id = (SELECT status_lookup.status_id from status_lookup WHERE status_lookup.status = @status_str) WHERE id=@customer_id";
                cnn.Execute(strQuery, new {customer_id = customer_id_in, status_str = status_in });
            }
        }

        private static string LoadConnectionString(string id="Default")
        {
            return ConfigurationManager.ConnectionStrings[id].ConnectionString;
        }
    }
}
