﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml;
using System.IO;
using OfficeOpenXml.Drawing.Chart;
using OfficeOpenXml.Style;
using OfficeOpenXml.Drawing;
using OfficeOpenXml.ConditionalFormatting;
using System.Threading;
using System.Drawing;
namespace EPPlusTest
{
    [TestClass]
    public class ReadTemplate //: TestBase
    {
        //[ClassInitialize()]
        //public static void ClassInit(TestContext testContext)
        //{
        //    //InitBase();
        //}
        //[ClassCleanup()]
        //public static void ClassCleanup()
        //{
        //    //SaveWorksheet("Worksheet.xlsx");
        //}
        [TestMethod]
        public void ReadBlankStream()
        {
            MemoryStream stream = new MemoryStream();
            using (ExcelPackage pck = new ExcelPackage(stream))
            {
                var ws = pck.Workbook.Worksheets.Add("Perf");
                pck.SaveAs(stream);
            }
            stream.Close();
        }
        [Ignore]
        [TestMethod]
        public void ReadBug()
        {
            var file = new FileInfo(@"c:\temp\Adenoviridae Protocol.xlsx");
            using (ExcelPackage pck = new ExcelPackage(file))
            {
                pck.Workbook.Worksheets[1].Cells["G4"].Value=12;
                pck.SaveAs(new FileInfo(@"c:\temp\Adenoviridae Protocol2.xlsx"));
            }
        }
        [Ignore]
        [TestMethod]
        public void ReadBug3()
        {
            ExcelPackage xlsPack = new ExcelPackage(new FileInfo(@"c:\temp\billing_template.xlsx"));
            ExcelWorkbook xlsWb = xlsPack.Workbook;
            ExcelWorksheet xlsSheet = xlsWb.Worksheets["Billing"];
        }
        [Ignore]
        [TestMethod]
        public void ReadBug2()
        {
            var file = new FileInfo(@"c:\temp\book2.xlsx");
            using (ExcelPackage pck = new ExcelPackage(file))
            {
                Assert.AreEqual("Good", pck.Workbook.Worksheets[1].Cells["A1"].StyleName);
                Assert.AreEqual("Good 2", pck.Workbook.Worksheets[1].Cells["C1"].StyleName);
                Assert.AreEqual("Note", pck.Workbook.Worksheets[1].Cells["G11"].StyleName);
                pck.SaveAs(new FileInfo(@"c:\temp\Adenoviridae Protocol2.xlsx"));
            }
        }
        [Ignore]
        [TestMethod]
        public void CondFormatDataValBug()
        {            
            var file = new FileInfo(@"c:\temp\condi.xlsx");
            using (ExcelPackage pck = new ExcelPackage(file))
            {
                var dv = pck.Workbook.Worksheets[1].Cells["A1"].DataValidation.AddIntegerDataValidation();
                dv.Formula.Value = 1;
                dv.Formula2.Value = 4;
                dv.Operator = OfficeOpenXml.DataValidation.ExcelDataValidationOperator.equal;
                pck.SaveAs(new FileInfo(@"c:\temp\condi2.xlsx"));
            }
        }
        [Ignore]
        [TestMethod]
        public void InternalZip()
        {
            //var file = @"c:\temp\condi.xlsx";
            //using (ExcelPackage pck = new ExcelPackage(file))
            //{
            //}
        }
        [Ignore]
        [TestMethod]
        public void ReadBug4()
        {
            var lines = new List<string>();
            var package = new ExcelPackage(new FileInfo(@"c:\temp\test.xlsx"));

            ExcelWorkbook workBook = package.Workbook;
            if (workBook != null)
            {
            if (workBook.Worksheets.Count > 0) //fails on this line
            {
            // Get the first worksheet
            ExcelWorksheet currentWorksheet = workBook.Worksheets.First();

            var rowCount = 1;
            var lastRow = currentWorksheet.Dimension.End.Row;
            var lastColumn = currentWorksheet.Dimension.End.Column;
            while (rowCount <= lastRow)
            {
            var columnCount = 1;
            var line = "";
            while (columnCount <= lastColumn)
            {
            line += currentWorksheet.Cells[rowCount, columnCount].Value + "|";
            columnCount++;
            }
            lines.Add(line);
            rowCount++;
            }
            }
            }
        }
        [Ignore]
        [TestMethod]
        public void ReadBug5()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\2.9 bugs\protect.xlsx"));

            package.Workbook.Worksheets[1].Protection.AllowInsertColumns = true;
            package.Workbook.Worksheets[1].Protection.SetPassword("test");
            package.SaveAs(new FileInfo(@"c:\temp\2.9 bugs\protectnew.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadBug6()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\2.9 bugs\outofrange\error.xlsx"));

            package.Workbook.Worksheets[1].Protection.AllowInsertColumns = true;
            package.Workbook.Worksheets[1].Protection.SetPassword("test");
            package.SaveAs(new FileInfo(@"c:\temp\2.9 bugs\error.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadBug7()
        {
            var package = new ExcelPackage();
            var ws = package.Workbook.Worksheets.Add("test");
            using (var rng = ws.Cells["A1"])
            {
                var rt1 = rng.RichText.Add("TEXT1\r\n");
                rt1.Bold = true;
                rng.Style.WrapText = true;
                var rt2=rng.RichText.Add("TEXT2");
                rt2.Bold = false;
            }
            
            package.SaveAs(new FileInfo(@"c:\temp\2.9 bugs\error.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadBug8()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\2.9 bugs\bug\Genband SO CrossRef Phoenix.xlsx"));
            var ws = package.Workbook.Worksheets[1];
            using (var rng = ws.Cells["A1"])
            {
                var rt1 = rng.RichText.Add("TEXT1\r\n");
                rt1.Bold = true;
                rng.Style.WrapText = true;
                var rt2 = rng.RichText.Add("TEXT2");
                rt2.Bold = false;
            }

            package.SaveAs(new FileInfo(@"c:\temp\2.9 bugs\billing_template.xlsx.error"));
        }
        [Ignore]
        [TestMethod]
        public void ReadBug9()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\CovenantsCheckReportTemplate.xlsx"));
            var ws = package.Workbook.Worksheets[1];
            package.SaveAs(new FileInfo(@"c:\temp\2.9 bugs\new_t.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadBug10()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\Model_graphes_MBW.xlsm"));

            var ws = package.Workbook.Worksheets["HTTP_data"];
            Assert.IsNotNull(ws.Cells["B4"].Style.Fill.BackgroundColor.Indexed);
            Assert.IsNotNull(ws.Cells["B5"].Style.Fill.BackgroundColor.Indexed);
        }
        [Ignore]
        [TestMethod]
        public void ReadBug11()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\sample.xlsx"));
            var ws = package.Workbook.Worksheets[1];
            var pck2 = new ExcelPackage();
            pck2.Workbook.Worksheets.Add("Test", ws);
            pck2.SaveAs(new FileInfo(@"c:\temp\SampleNew.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadConditionalFormatting()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\cf2.xlsx"));
            var ws = package.Workbook.Worksheets[1];
            ws.Cells["A1"].Value = 1;
            Assert.AreEqual(ws.ConditionalFormatting[6].Type, eExcelConditionalFormattingRuleType.Equal);
            package.SaveAs(new FileInfo(@"c:\temp\condFormTest.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadStyleBug()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\acquisitions-1993-2.xlsx"));
            var ws = package.Workbook.Worksheets[1];
            ws.Cells["A1"].Value = 1;
            package.SaveAs(new FileInfo(@"c:\temp\condFormTest.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadURL()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\bug\url.xlsx"));
            var ws = package.Workbook.Worksheets[1];
            ws.Cells["A1"].Value = 1;
            package.SaveAs(new FileInfo(@"c:\temp\condFormTest.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadNameError()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\names2.xlsx"));
            var ws = package.Workbook.Worksheets[1];
            ws.Cells["A1"].Value = 1;
            package.SaveAs(new FileInfo(@"c:\temp\TestTableSave.xlsx"));
        }        
        [TestMethod, Ignore]
        public void ReadBug12()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\bug\test4.xlsx"));
            var ws = package.Workbook.Worksheets[1];
            ws.Cells["A1"].Value = 1;
            //ws.Column(0).Style.Font.Bold = true;
            package.SaveAs(new FileInfo(@"c:\temp\bug2.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadBug13()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\original.xlsx"));
            var ws = package.Workbook.Worksheets[1];
            package.Workbook.Calculate(new OfficeOpenXml.FormulaParsing.ExcelCalculationOption() { AllowCirculareReferences = true });
            package.SaveAs(new FileInfo(@"c:\temp\bug2.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadBug14()
        {
            var package = new ExcelPackage();
            var ws = package.Workbook.Worksheets.Add("Comment");
            ws.Cells["A1"].AddComment("Test av kommentar", "J");
            ws.Comments.RemoveAt(0);
            package.SaveAs(new FileInfo(@"c:\temp\bug\CommentTest.xlsx"));
        }
        [Ignore]
        [TestMethod]
        public void ReadBug15()
        {
            var package = new ExcelPackage(new FileInfo(@"c:\temp\bug\ColumnMaxError.xlsx"));
            var ws = package.Workbook.Worksheets[1];
            var col = ws.Column(1);
            col.Style.Fill.PatternType = ExcelFillStyle.Solid;
            col.Style.Fill.BackgroundColor.SetColor(Color.Red);
            package.SaveAs(new FileInfo(@"c:\temp\bug2.xlsx"));
        }
        #region "Threading Cellstore Test"
        public int _threadCount=0;
        ExcelPackage _pckThread;
        [TestMethod, Ignore]
        public void ThreadingTest()
        {
            _pckThread = new ExcelPackage();
            var ws = _pckThread.Workbook.Worksheets.Add("Threading");

            for (int t = 0; t < 20; t++)
            {
                var ts=new ThreadState(Finnished)
                {
                    ws=ws,
                    StartRow=1+(t*1000),
                    Rows=1000,                    
                };
                var tstart=new ThreadStart(ts.StartLoad);                                
                var thread = new Thread(tstart);
                _threadCount++;
                thread.Start();
            }
            while (1 == 1)
            {                
                if (_threadCount == 0)
                {
                    _pckThread.SaveAs(new FileInfo("c:\\temp\\thread.xlsx"));
                    break;
                }
                Thread.Sleep(1000);
            }
        }
        public void Finnished()
        {
            _threadCount--;
        }
        private class ThreadState
        {
            public ThreadState(cbFinished cb)
            {
                _cb = cb;
            }
            public ExcelWorksheet ws { get; set; }
            public int StartRow { get; set; }
            public int Rows { get; set; }
            public delegate void cbFinished();
            public cbFinished _cb;
            public void StartLoad()
            {
                for(int row=StartRow;row<StartRow+Rows;row++)
                {
                    for (int col = 1; col < 100; col++)
                    {
                        ws.SetValue(row,col,string.Format("row {0} col {1}", row,col));
                    }
                }
                _cb();
            }
        }
        #endregion
        [Ignore]
        [TestMethod]
        public void TestInvalidVBA()
        {
            const string infile=@"C:\temp\bug\Infile.xlsm";
            const string outfile=@"C:\temp\bug\Outfile.xlsm";
            ExcelPackage ep;

            using (FileStream fs = File.OpenRead(infile))
            {
                ep = new ExcelPackage(fs);
            }

            using (FileStream fs = File.OpenWrite(outfile))
            {
                ep.SaveAs(fs);
            }

            using (FileStream fs = File.OpenRead(outfile))
            {
                ep = new ExcelPackage(fs);
            }

            using (FileStream fs = File.OpenWrite(outfile))
            {
                ep.SaveAs(fs);
            }            
        }
        [Ignore]
        [TestMethod]
        public void StreamTest()
        {
            using (var templateStream = File.OpenRead(@"c:\temp\thread.xlsx"))
            {

                using (var outStream = File.Open(@"c:\temp\streamOut.xlsx", FileMode.Create, FileAccess.ReadWrite, FileShare.None))
                {
                    using (var package = new ExcelPackage(outStream, templateStream))
                    {
                        package.Workbook.Worksheets[1].Cells["A1"].Value = 1;
                        // Create more content
                        package.Save();
                    }
                }
            }
        }
        [TestMethod, Ignore]
        public void test()
        { 
            CreateXlsxSheet(@"C:\temp\bug\test4.xlsx", 4, 4);
            CreateXlsxSheet(@"C:\temp\bug\test25.xlsx", 25, 25); 
        }
        [Ignore]
        [TestMethod]
        public void I15038()
        {
            using(var p = new ExcelPackage(new FileInfo(@"c:\temp\bug\15038.xlsx")))
            {
                var ws=p.Workbook.Worksheets[1];
            
            }
        }
        [Ignore]
        [TestMethod]
        public void I15039()
        {
            using (var p = new ExcelPackage(new FileInfo(@"c:\temp\bug\15039.xlsm")))
            {
                var ws = p.Workbook.Worksheets[1];

                p.SaveAs(new FileInfo(@"c:\temp\bug\15039-saved.xlsm"));
            }
        }
        [Ignore]
        [TestMethod]
        public void I15030()
        {
            using (var newPack = new ExcelPackage(new FileInfo(@"c:\temp\bug\I15030.xlsx")))
            {
                var wkBk = newPack.Workbook.Worksheets[1];
                var cell = wkBk.Cells["A1"];
                if (cell.Comment != null)
                {
                    cell.Comment.Text = "Hello edited comments";
                }
                newPack.SaveAs(new FileInfo(@"c:\temp\bug\15030-save.xlsx"));
            }
        }
        [Ignore]
        [TestMethod]
        public void I15014()
        {
            using (var p = new ExcelPackage(new FileInfo(@"c:\temp\bug\ClassicWineCompany.xlsx")))
            {
                var ws = p.Workbook.Worksheets[1];
                Assert.AreEqual("SFFSectionHeading00", ws.Cells[5, 2].StyleName);
            }
        }
        [Ignore]
        [TestMethod]
        public void I15043()
        {
            using (var p = new ExcelPackage(new FileInfo(@"C:\temp\bug\EPPlusTest\EPPlusTest\EPPlusTest\example.xlsx")))
            {
                var ws = p.Workbook.Worksheets[1];
                p.Workbook.Worksheets.Copy(ws.Name, "Copy");
            }
        }
        [TestMethod, Ignore]
        public void whitespace()
        {
            using (var p = new ExcelPackage(new FileInfo(@"C:\temp\bug\GridToExcel_05-12-2014.xlsx")))
            {
                var ws = p.Workbook.Worksheets[1];
                foreach (var cell in ws.Cells[1,84,3,86])
                {
                    Console.WriteLine(cell.Address);
                }
            }
        }
        [TestMethod, Ignore]
        public void SaveCorruption()
        {
            using (var p = new ExcelPackage(new FileInfo(@"C:\temp\bug\tables.xlsx")))
            {
                var ws = p.Workbook.Worksheets[1];
                p.SaveAs(new FileInfo(@"c:\temp\bug\corr.xlsx"));
            }
        }
        [TestMethod]
        public void VBAerror()
        {
            ExcelWorksheet ws;
            using (var p = new ExcelPackage())
            {
                p.Workbook.CreateVBAProject();
                ws = p.Workbook.Worksheets.Add("Градуировка");                
                using (var p2 = new ExcelPackage())
                {
                    p2.Workbook.CreateVBAProject();
                    var ws2 = p2.Workbook.Worksheets.Add("Градуировка2", ws);
                }
            }
        }

        [TestMethod, Ignore]
        public void CopyIssue()
        {
            using (var pkg = new ExcelPackage())
            {
                var templateFile = ReadTemplateFile(@"C:\temp\bug\StackOverflow\EPPlusTest\20141120_01_3.各股累計收結表 (其他案件).xlsx");
                using (var ms = new System.IO.MemoryStream(templateFile))
                {
                    using (var tempPkg = new ExcelPackage(ms))
                    {
                        pkg.Workbook.Worksheets.Add("20141120_01_3.各股累計收結表 (其他案件)", tempPkg.Workbook.Worksheets.First());
                    }
                }
            }
        }
        [TestMethod, Ignore]
        public void FileStreamSave()
        {
            var fs = File.Create(@"c:\temp\fs.xlsx");
            using (var pkg = new ExcelPackage(fs))
            {
                var ws=pkg.Workbook.Worksheets.Add("test");
                ws.Cells["A1"].Value = 1;
                var col=ws.Column(1);
                col.OutlineLevel = 1;
                col.ColumnMax = ExcelPackage.MaxColumns;
                col.ColumnMax = 1;
                pkg.Save();
            }
        }
        public static byte[] ReadTemplateFile(string templateName)
        {
            byte[] templateFIle;
            using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
            {
                using (var sw = new System.IO.FileStream(templateName, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite))
                {
                    byte[] buffer = new byte[2048];
                    int bytesRead;
                    while ((bytesRead = sw.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        ms.Write(buffer, 0, bytesRead);
                    }
                }
                ms.Position = 0;
                templateFIle = ms.ToArray();
            }
            return templateFIle;
        }

        private static void CreateXlsxSheet(string pFileName, int pRows, int pColumns) 
        {
            if (File.Exists(pFileName)) File.Delete(pFileName);

            using (ExcelPackage excelPackage = new ExcelPackage(new FileInfo(pFileName)))
            {
                ExcelWorksheet excelWorksheet = excelPackage.Workbook.Worksheets.Add("Testsheet");

                // Fill with data
                for (int row = 1; row <= pRows; row++)
                {
                    for (int column = 1; column <= pColumns; column++)
                    {
                        if (column > 1 && row > 2)
                        {
                            using (ExcelRange range = excelWorksheet.Cells[row, column])
                            {
                                range.Style.Numberformat.Format = "0";
                                range.Style.HorizontalAlignment = ExcelHorizontalAlignment.Right;
                                range.Style.VerticalAlignment = ExcelVerticalAlignment.Center;
                            }
                            excelWorksheet.Cells[row, column].Value = row * column;
                        }
                    }
                }

                // Try to style the first column, begining with row 3 which has no content yet...
                using (ExcelRange range = excelWorksheet.Cells[ExcelCellBase.GetAddress(3, 1, pRows, 1)])
                {
                    ExcelStyle style = range.Style;
                }

                // now I would add data to the first column (left out here)...
                excelPackage.Save();
            } 
        }    
    }
}
