using Accord.MachineLearning;
using ExcelDataReader;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace MachineLearning
{
    public partial class Form1 : Form
    {
        private string filePath = @"C:\Users\Duy Nguyen\Downloads\DTB_IT.xlsx";

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read);
            IExcelDataReader excelReader;

            //1. Reading Excel file
            if (Path.GetExtension(filePath).ToUpper() == ".XLS")
            {
                //1.1 Reading from a binary Excel file ('97-2003 format; *.xls)
                excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
            }
            else
            {
                //1.2 Reading from a OpenXml Excel file (2007 format; *.xlsx)
                excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
            }
           
            //2. DataSet - The result of each spreadsheet will be created in the result.Tables
            DataSet result = excelReader.AsDataSet(new ExcelDataSetConfiguration()
            {
                // Gets or sets a value indicating whether to set the DataColumn.DataType 
                // property in a second pass.
                UseColumnDataType = true,

                // Gets or sets a callback to determine whether to include the current sheet
                // in the DataSet. Called once per sheet before ConfigureDataTable.
                FilterSheet = (tableReader, sheetIndex) => true,

                // Gets or sets a callback to obtain configuration options for a DataTable. 
                ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
                {
                    // Gets or sets a value indicating the prefix of generated column names.
                    EmptyColumnNamePrefix = "Column",

                    // Gets or sets a value indicating whether to use a row from the 
                    // data as column names.
                    UseHeaderRow = true,

                }
            });
            DataTable dt = result.Tables[0];
            

            List<double[]> data = new List<double[]>();

            foreach (DataRow dtRow in dt.Rows)
            {
                List<double> row = new List<double>();
                for(int i = 4; i <= 12; i++)
                {
                    double val = Double.Parse(dtRow[i].ToString());
                    row.Add(val);
                }
                
                
                data.Add(row.ToArray());
            }
            double[][] input = data.ToArray();



            KMeans kmeans = new KMeans(k: 2);
            //Hoc huan luyen
            var clusters = kmeans.Learn(input);
            //
            int[] labels = clusters.Decide(input);

            dt.Columns.Add("Cluster", typeof(System.Int32));
            foreach (DataRow dtRow in dt.Rows)
            {
                int index = dt.Rows.IndexOf(dtRow);
                dtRow["Cluster"] = labels[index];
            }

            dataGridView1.DataSource = dt;

            DataTable dt_lb1 = dt.AsEnumerable().Where(row => row.Field<Int32>("Cluster") == 0).CopyToDataTable();
            DataTable dt_lb2 = dt.AsEnumerable().Where(row => row.Field<Int32>("Cluster") == 1).CopyToDataTable();

            dataGridView2.DataSource = dt_lb1;
            dataGridView3.DataSource = dt_lb2;
        }
    }
}