﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OfficeOpenXml;

namespace EPPlusExcelFormDemo
{
    public partial class ExcelForm : Form
    {
        private ExcelPackage _package;
        private DataGridViewCell _currentCell;
        private Font _inactiveCellFont;
        private Font _activeCellFont;
        private const int NumberOfColumns = 5;

        public ExcelForm()
        {
            InitializeComponent();
            InitializePackage();
            InitPackageToUI();
            this.Closing += (sender, args) => _package.Dispose();
            dataGridView_Ws1.RowHeadersWidth = 50;
            dataGridView_Ws1.Select();
        }

        private void InitializePackage()
        {
            _package = new ExcelPackage(new MemoryStream());
            var ws1 = _package.Workbook.Worksheets.Add("Worksheet1");
            for (var col = 2; col < NumberOfColumns; col++)
            {
                for (var row = 1; row < 9; row++)
                {
                    ws1.Cells[row, col].Value = row*col;
                }
            }
            ws1.Cells[7, 1].Value = "SUM";
            ws1.Cells[7, 2].Formula = "SUM(B1:B6)";
            ws1.Cells[7, 3].Formula = "SUM(C1:C6)";
            ws1.Cells[7, 4].Formula = "SUM(D1:D6)";

            ws1.Cells[8, 1].Value = "STDEV";
            ws1.Cells[8, 2].Formula = "STDEV(B1:B6)";
            ws1.Cells[8, 3].Formula = "STDEV(C1:C6)";
            ws1.Cells[8, 4].Formula = "STDEV(D1:D6)";
            _package.Workbook.Calculate();
        }

        private void InitFonts(DataGridView gridView)
        {
            _activeCellFont = new Font(gridView.Font, FontStyle.Bold);
            _inactiveCellFont = gridView.Font;
        }

        private void InitEvents(DataGridView gridView)
        {
            gridView.CellEnter += DataGrid1OnCellEnter;
            gridView.CellLeave += DataGrid1OnCellLeave; 
        }

        /// <summary>
        /// Binds the EPPlus package (or actually only its first worksheet)
        /// to the DataGridView.
        /// </summary>
        private void InitPackageToUI()
        {
            var ws = _package.Workbook.Worksheets.First();
            var page1 = this.tabControl_Worksheets.Controls[0] as TabPage;
            page1.Text = ws.Name;
            var gridView = GetGrid();
            InitFonts(gridView);
            InitEvents(gridView);
            
            for (var row = 0; row < ws.Dimension.Rows; row++)
            {
                var gridRow = new DataGridViewRow {HeaderCell = {Value = (row + 1).ToString()}};
                for (var col = 0; col < NumberOfColumns; col++)
                {
                    var cell = ws.Cells[row + 1, col + 1];
                    if (cell.Value!=null)
                    {
                        using (var uiCell = new DataGridViewTextBoxCell())
                        {
                            uiCell.Value = cell.Value;
                            gridRow.Cells.Add(uiCell);
                        }
                    }
                }
                gridView.Rows.Add(gridRow);
            }
            gridView.Refresh();
        }

        private void BindPackageToUI()
        {
            var dataGrid1 = GetGrid();
            for (var row = 1; row < _package.Workbook.Worksheets.First().Dimension.Rows + 1; row++)
            {
                for (var col = 1; col <= NumberOfColumns; col++)
                {
                    var excelCell = _package.Workbook.Worksheets.First().Cells[row, col];
                    var gridViewCell = dataGrid1.Rows[row - 1].Cells[col - 1];
                    gridViewCell.Value = excelCell.Value;
                }
            }
            dataGrid1.Refresh();
        }

        private object CellValueToObject(string cellVal)
        {
            if (ConvertUtil.IsNumericString(cellVal))
            {
                return double.Parse(cellVal, CultureInfo.InvariantCulture);
            }
            return cellVal;
        }

        private void DataGrid1OnCellLeave(object sender, DataGridViewCellEventArgs e)
        {
            var dataGrid1 = GetGrid();
            var gridViewCell = dataGrid1.Rows[e.RowIndex].Cells[e.ColumnIndex];
            var excelCell = _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1];
            gridViewCell.Style.ForeColor = Color.Black;
            gridViewCell.Style.BackColor = Color.White;
            gridViewCell.Style.Font = _inactiveCellFont;
        }


        private DataGridView GetGrid()
        {
            var page1 = this.tabControl_Worksheets.Controls[0] as TabPage;
            var dataGrid1 = page1.Controls["dataGridView_Ws1"] as DataGridView;
            return dataGrid1;
        }

        private void DataGrid1OnCellEnter(object sender, DataGridViewCellEventArgs e)
        {
            var dataGrid1 = GetGrid();
            dataGrid1.Refresh();
            BindPackageToUI();
            var cell = dataGrid1.Rows[e.RowIndex].Cells[e.ColumnIndex];
            var excelCell = _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1];
            if (!string.IsNullOrEmpty(excelCell.Formula))
            {
                textBox_fx.Text = "=" + excelCell.Formula;
                cell.Value = "=" + excelCell.Formula;
            }
            else if(excelCell.Value != null)
            {
                textBox_fx.Text = excelCell.Value.ToString();
            }
            cell.Style.ForeColor = Color.Blue;
            cell.Style.BackColor = Color.Gainsboro;
            cell.Style.Font = _activeCellFont;
            _currentCell = cell;
        }

        private void button_Save_Click(object sender, EventArgs e)
        {
            saveFileDialog_SaveExcel.Filter = "Excel files (*.xlsx)|*.xlsx";
            var dialogResult = saveFileDialog_SaveExcel.ShowDialog();
            if (dialogResult == DialogResult.OK)
            {
                _package.SaveAs(new FileInfo(saveFileDialog_SaveExcel.FileName));
            }
        }

        private void button_ApplyFormula_Click(object sender, EventArgs e)
        {
            var row = _currentCell.RowIndex;
            var col = _currentCell.ColumnIndex;
            var txt = textBox_fx.Text;
            if (txt.StartsWith("="))
            {
                _package.Workbook.Worksheets.First().Cells[row + 1, col + 1].Formula = txt.Substring(1);
            }
            else
            {
                _package.Workbook.Worksheets.First().Cells[row + 1, col + 1].Formula = null;
                _package.Workbook.Worksheets.First().Cells[row + 1, col + 1].Value = CellValueToObject(txt);
            }
            try
            {
                _package.Workbook.Calculate();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            BindPackageToUI();
            this.Refresh();
        }

        private void dataGridView_Ws1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            var dataGrid1 = GetGrid();
            var cell = dataGrid1.Rows[e.RowIndex].Cells[e.ColumnIndex];
            var excelCell = _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1];
            if (!string.IsNullOrEmpty(excelCell.Formula))
            {
                cell.Value = "=" + excelCell.Formula;
            }
            dataGrid1.Refresh();
        }

        private void dataGridView_Ws1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            var f = e.FormattedValue.ToString();
            if (f.StartsWith("="))
            {
                _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1].Formula = f.Substring(1);
            }
            else
            {
                _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1].Formula = null;
                _package.Workbook.Worksheets.First().Cells[e.RowIndex + 1, e.ColumnIndex + 1].Value = CellValueToObject(f);
            }
            try
            {
                _package.Workbook.Calculate();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            BindPackageToUI();
            this.Refresh();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var frm = new frmFunctions(_package.Workbook.FormulaParserManager.GetImplementedFunctionNames().ToList());
            frm.ShowDialog(this);
            
        }
    }
}
