﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
using OfficeOpenXml;
using System.IO;

namespace EPPlusTest
{
    [TestClass]
    public class Encrypt : TestBase
    {
        [TestMethod]
        [Ignore]
        public void ReadWriteEncrypt()
        {
            using (ExcelPackage pck = new ExcelPackage(new FileInfo(@"Test\Drawing.xlsx"), true))   
            {
                pck.Encryption.Password = "EPPlus";
                pck.Encryption.Algorithm = EncryptionAlgorithm.AES192;
                pck.Workbook.Protection.SetPassword("test");
                pck.Workbook.Protection.LockStructure = true;
                pck.Workbook.Protection.LockWindows = true;

                pck.SaveAs(new FileInfo(@"Test\DrawingEncr.xlsx"));                
            }

            using (ExcelPackage pck = new ExcelPackage(new FileInfo(_worksheetPath + @"\DrawingEncr.xlsx"), true, "EPPlus"))            
            {
                pck.Encryption.IsEncrypted = false;
                pck.SaveAs(new FileInfo(_worksheetPath + @"\DrawingNotEncr.xlsx"));
            }

            FileStream fs = new FileStream(_worksheetPath + @"\DrawingEncr.xlsx", FileMode.Open, FileAccess.ReadWrite);
            using (ExcelPackage pck = new ExcelPackage(fs, "EPPlus"))
            {
                pck.Encryption.IsEncrypted = false;
                pck.SaveAs(new FileInfo(_worksheetPath + @"DrawingNotEncr.xlsx"));
            }

        }
        [TestMethod]
        [Ignore]
        public void WriteEncrypt()
        {
            ExcelPackage package = new ExcelPackage();
            //Load the sheet with one string column, one date column and a few random numbers.
            var ws = package.Workbook.Worksheets.Add("First line test");

            ws.Cells[1, 1].Value = "1; 1";
            ws.Cells[2, 1].Value = "2; 1";
            ws.Cells[1, 2].Value = "1; 2";
            ws.Cells[2, 2].Value = "2; 2";

            ws.Row(1).Style.Font.Bold = true;
            ws.Column(1).Style.Font.Bold = true;

            //package.Encryption.Algorithm = EncryptionAlgorithm.AES256;
            //package.SaveAs(new FileInfo(@"c:\temp\encrTest.xlsx"), "ABxsw23edc");
            package.Encryption.Password = "test";
            package.Encryption.IsEncrypted = true;
            package.SaveAs(new FileInfo(@"c:\temp\encrTest.xlsx"));
        }
        [TestMethod]
        [Ignore]
        public void WriteProtect()
        {
            ExcelPackage package = new ExcelPackage(new FileInfo(@"c:\temp\workbookprot2.xlsx"), "");
            //Load the sheet with one string column, one date column and a few random numbers.
            //package.Workbook.Protection.LockWindows = true;
            //package.Encryption.IsEncrypted = true;
            package.Workbook.Protection.SetPassword("t");
            package.Workbook.Protection.LockStructure = true;
            package.Workbook.View.Left = 585;
            package.Workbook.View.Top = 150;

            package.Workbook.View.Width = 17310;
            package.Workbook.View.Height = 38055;
            var ws = package.Workbook.Worksheets.Add("First line test");

            ws.Cells[1, 1].Value = "1; 1";
            ws.Cells[2, 1].Value = "2; 1";
            ws.Cells[1, 2].Value = "1; 2";
            ws.Cells[2, 2].Value = "2; 2";

            package.SaveAs(new FileInfo(@"c:\temp\workbookprot2.xlsx"));

        }
        [TestMethod]
        [Ignore]
        public void DecrypTest()
        {
            var p = new ExcelPackage(new FileInfo(@"c:\temp\encr.xlsx"), "test");

            var n = p.Workbook.Worksheets[1].Name;
            p.Encryption.Password = null;
            p.SaveAs(new FileInfo(@"c:\temp\encrNew.xlsx"));
        
        }
        [TestMethod]
        [Ignore]
        public void EncrypTest()
        {
            var f = new FileInfo(@"c:\temp\encrwrite.xlsx");
            if (f.Exists)
            {
                f.Delete();
            }
            var p = new ExcelPackage(f);
            
            p.Workbook.Protection.SetPassword("");
            p.Workbook.Protection.LockStructure = true;
            p.Encryption.Version = EncryptionVersion.Agile;

            var ws = p.Workbook.Worksheets.Add("Sheet1");
            for (int r = 1; r < 1000; r++)
            {
                ws.Cells[r, 1].Value = r;
            }
            p.Save();
        }
    }
}
