﻿/* 
 * You may amend and distribute as you like, but don't remove this header!
 * 
 * EPPlus provides server-side generation of Excel 2007 spreadsheets.
 * See http://www.codeplex.com/EPPlus for details.
 * 
 * All rights reserved.
 * 
 * EPPlus is an Open Source project provided under the 
 * GNU General Public License (GPL) as published by the 
 * Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 * 
 * The GNU General Public License can be viewed at http://www.opensource.org/licenses/gpl-license.php
 * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
 * 
 * The code for this project may be used and redistributed by any means PROVIDING it is 
 * not sold for profit without the author's written consent, and providing that this notice 
 * and the author's name and all copyright notices remain intact.
 * 
 * All code and executables are provided "as is" with no warranty either express or implied. 
 * The author accepts no liability for any damage or loss of business that this product may cause.
 *
 *  Code change notes:
 * 
 * Author							Change						Date
 * ******************************************************************************
 * Mats Alm   		                Added       		        2011-01-08
 *******************************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using OfficeOpenXml;
using OfficeOpenXml.DataValidation;
using OfficeOpenXml.DataValidation.Contracts;

namespace EPPlusSamples
{
    /// <summary>
    /// This sample shows how to use data validation
    /// </summary>
    class Sample11
    {
        public static string RunSample11(DirectoryInfo outputDir)
        {
            //Create a Sample10 directory...
            if (!Directory.Exists(outputDir.FullName + @"\Sample11"))
            {
                outputDir.CreateSubdirectory("Sample11");
            }
            outputDir = new DirectoryInfo(outputDir + @"\Sample11");

            //create FileInfo object...
            FileInfo output = new FileInfo(outputDir.FullName + @"\Output.xlsx");
            if (output.Exists)
            {
                output.Delete();
                output = new FileInfo(outputDir.FullName + @"\Output.xlsx");
            }

            using (var package = new ExcelPackage(output))
            {
                AddIntegerValidation(package);
                AddListValidationFormula(package);
                AddListValidationValues(package);
                AddTimeValidation(package);
                AddDateTimeValidation(package);
                ReadExistingValidationsFromPackage(package);
                package.SaveAs(output);
            }
            return output.FullName;
        }

        /// <summary>
        /// Adds integer validation
        /// </summary>
        /// <param name="file"></param>
        private static void AddIntegerValidation(ExcelPackage package)
        {
            var sheet = package.Workbook.Worksheets.Add("integer");
            // add a validation and set values
            var validation = sheet.DataValidations.AddIntegerValidation("A1:A2");
            // Alternatively:
            //var validation = sheet.Cells["A1:A2"].DataValidation.AddIntegerDataValidation();
            validation.ErrorStyle = ExcelDataValidationWarningStyle.stop;
            validation.PromptTitle = "Enter a integer value here";
            validation.Prompt = "Value should be between 1 and 5";
            validation.ShowInputMessage = true;
            validation.ErrorTitle = "An invalid value was entered";
            validation.Error = "Value must be between 1 and 5";
            validation.ShowErrorMessage = true;
            validation.Operator = ExcelDataValidationOperator.between;
            validation.Formula.Value = 1;
            validation.Formula2.Value = 5;

            Console.WriteLine("Added sheet for integer validation");
        }

        /// <summary>
        /// Adds a list validation where the list source is a formula
        /// </summary>
        /// <param name="package"></param>
        private static void AddListValidationFormula(ExcelPackage package)
        {
            var sheet = package.Workbook.Worksheets.Add("list formula");
            sheet.Cells["B1"].Style.Font.Bold = true;
            sheet.Cells["B1"].Value = "Source values";
            sheet.Cells["B2"].Value = 1;
            sheet.Cells["B3"].Value = 2;
            sheet.Cells["B4"].Value = 3;
            
            // add a validation and set values
            var validation = sheet.DataValidations.AddListValidation("A1");
            // Alternatively:
            // var validation = sheet.Cells["A1"].DataValidation.AddListDataValidation();
            validation.ShowErrorMessage = true;
            validation.ErrorStyle = ExcelDataValidationWarningStyle.warning;
            validation.ErrorTitle = "An invalid value was entered";
            validation.Error = "Select a value from the list";
            validation.Formula.ExcelFormula = "B2:B4";

            Console.WriteLine("Added sheet for list validation with formula");
            
        }

        /// <summary>
        /// Adds a list validation where the selectable values are set
        /// </summary>
        /// <param name="package"></param>
        private static void AddListValidationValues(ExcelPackage package)
        {
            var sheet = package.Workbook.Worksheets.Add("list values");

            // add a validation and set values
            var validation = sheet.DataValidations.AddListValidation("A1");
            validation.ShowErrorMessage = true;
            validation.ErrorStyle = ExcelDataValidationWarningStyle.warning;
            validation.ErrorTitle = "An invalid value was entered";
            validation.Error = "Select a value from the list";
            for (var i = 1; i <= 5; i++)
            {
                validation.Formula.Values.Add(i.ToString());
            }
            Console.WriteLine("Added sheet for list validation with values");

        }

        /// <summary>
        /// Adds a time validation
        /// </summary>
        /// <param name="package"></param>
        private static void AddTimeValidation(ExcelPackage package)
        {
            var sheet = package.Workbook.Worksheets.Add("time");
            // add a validation and set values
            var validation = sheet.DataValidations.AddTimeValidation("A1");
            // Alternatively:
            // var validation = sheet.Cells["A1"].DataValidation.AddTimeDataValidation();
            validation.ShowErrorMessage = true;
            validation.ErrorStyle = ExcelDataValidationWarningStyle.stop;
            validation.ShowInputMessage = true;
            validation.PromptTitle = "Enter time in format HH:MM:SS";
            validation.Prompt = "Should be greater than 13:30:10";
            validation.Operator = ExcelDataValidationOperator.greaterThan;
            var time = validation.Formula.Value;
            time.Hour = 13;
            time.Minute = 30;
            time.Second = 10;
            Console.WriteLine("Added sheet for time validation");
        }

        private static void AddDateTimeValidation(ExcelPackage package)
        {
            var sheet = package.Workbook.Worksheets.Add("datetime");
            // add a validation and set values
            var validation = sheet.DataValidations.AddDateTimeValidation("A1");
            // Alternatively:
            // var validation = sheet.Cells["A1"].DataValidation.AddDateTimeDataValidation();
            validation.ShowErrorMessage = true;
            validation.ErrorStyle = ExcelDataValidationWarningStyle.stop;
            validation.Error = "Invalid date!";
            validation.ShowInputMessage = true;
            validation.Prompt = "Enter a date greater than todays date here";
            validation.Operator = ExcelDataValidationOperator.greaterThan;
            validation.Formula.Value = DateTime.Now.Date;
            Console.WriteLine("Added sheet for date time validation");

        }

        /// <summary>
        /// shows details about all existing validations in the entire workbook
        /// </summary>
        /// <param name="package"></param>
        private static void ReadExistingValidationsFromPackage(ExcelPackage package)
        {
            var sheet = package.Workbook.Worksheets.Add("Package validations");
            // print headers
            sheet.Cells["A1:E1"].Style.Font.Bold = true;
            sheet.Cells["A1"].Value = "Type";
            sheet.Cells["B1"].Value = "Address";
            sheet.Cells["C1"].Value = "Operator";
            sheet.Cells["D1"].Value = "Formula1";
            sheet.Cells["E1"].Value = "Formula2";

            int row = 2;
            foreach (var otherSheet in package.Workbook.Worksheets)
            {
                if(otherSheet == sheet)
                {
                    continue;
                }
                foreach (var dataValidation in otherSheet.DataValidations)
                {
                    sheet.Cells["A" + row.ToString()].Value = dataValidation.ValidationType.Type.ToString();
                    sheet.Cells["B" + row.ToString()].Value = dataValidation.Address.Address;
                    if (dataValidation.AllowsOperator)
                    {
                        sheet.Cells["C" + row.ToString()].Value = ((IExcelDataValidationWithOperator)dataValidation).Operator.ToString();
                    }
                    // type casting is needed to get validationtype-specific values
                    switch(dataValidation.ValidationType.Type)
                    {
                        case eDataValidationType.Whole:
                            PrintWholeValidationDetails(sheet, (IExcelDataValidationInt)dataValidation, row);
                            break;
                        case eDataValidationType.List:
                            PrintListValidationDetails(sheet, (IExcelDataValidationList)dataValidation, row);
                            break;
                        case eDataValidationType.Time:
                            PrintTimeValidationDetails(sheet, (ExcelDataValidationTime)dataValidation, row);
                            break;
                        default:
                            // the rest of the types are not supported in this sample, but I hope you get the picture...
                            break;
                    }
                    row++;
                }
            }
        }

        private static void PrintWholeValidationDetails(ExcelWorksheet sheet, IExcelDataValidationInt wholeValidation, int row)
        {
            sheet.Cells["D" + row.ToString()].Value = wholeValidation.Formula.Value.HasValue ? wholeValidation.Formula.Value.Value.ToString() : wholeValidation.Formula.ExcelFormula;
            sheet.Cells["E" + row.ToString()].Value = wholeValidation.Formula2.Value.HasValue ? wholeValidation.Formula2.Value.Value.ToString() : wholeValidation.Formula2.ExcelFormula;
        }

        private static void PrintListValidationDetails(ExcelWorksheet sheet, IExcelDataValidationList listValidation, int row)
        {
            string value = string.Empty;
            // if formula is used - show it...
            if(!string.IsNullOrEmpty(listValidation.Formula.ExcelFormula))
            {
                value = listValidation.Formula.ExcelFormula;
            }
            else
            {
                // otherwise - show the values from the list collection
                var sb = new StringBuilder();
                foreach(var listValue in listValidation.Formula.Values)
                {
                    if(sb.Length > 0)
                    {
                        sb.Append(",");
                    }
                    sb.Append(listValue);
                }
                value = sb.ToString();
            }
            sheet.Cells["D" + row.ToString()].Value = value;
        }

        private static void PrintTimeValidationDetails(ExcelWorksheet sheet, ExcelDataValidationTime validation, int row)
        {
            var value1 = string.Empty;
            if(!string.IsNullOrEmpty(validation.Formula.ExcelFormula))
            {
                value1 = validation.Formula.ExcelFormula;
            }
            else
            {
                value1 = string.Format("{0}:{1}:{2}", validation.Formula.Value.Hour, validation.Formula.Value.Minute, validation.Formula.Value.Second ?? 0);
            }
            sheet.Cells["D" + row.ToString()].Value = value1;
        }
    }
}
