using Org.BouncyCastle.Asn1.Mozilla;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using InABox.Core;
namespace InABox.Scripting
{
    public enum CellType
    {
        Formula,
        Numeric,
        Error,
        String,
        Boolean,
        Blank,
        Unknown,
        Date
    }
    public class CellRange
    {
        public int FirstRow { get; set; }
        public int LastRow { get; set; }
        public int FirstColumn { get; set; }
        public int LastColumn { get; set; }
        public CellRange(int firstRow, int lastRow, int firstColumn, int lastColumn)
        {
            FirstRow = firstRow;
            LastRow = lastRow;
            FirstColumn = firstColumn;
            LastColumn = lastColumn;
        }
    }
    public interface IDataFormat {
        public short FormatIndex { get; }
    }
    public enum UnderlineType
    {
        None,
        Single,
        Double,
        SingleAccounting,
        DoubleAccounting
    }
    public interface IFont
    {
        public bool Bold { get; set; }
        public bool Italic { get; set; }
        public UnderlineType Underline { get; set; }
        public double FontSize { get; set; }
        public Color Colour { get; }
    }
    public enum CellAlignment
    {
        Start,
        Middle,
        End,
        Justify
    }
    public interface ICellStyle
    {
        public ISpreadsheet Spreadsheet { get; }
        public IDataFormat DataFormat { get; set; }
        public IFont Font { get; }
        public Color Background { get; }
        public Color Foreground { get; }
        
        public CellAlignment VerticalAlignment { get; }
        
        public CellAlignment HorizontalAlignment { get; }
        
        public bool WrapText { get; }
        
    }
    public interface ISheet
    {
        public string Name { get; }
        int FirstRow { get; }
        int LastRow { get; }
        ISpreadsheet Spreadsheet { get; }
        IRow NewRow();
        IRow? GetRow(int row);
        /// 
        /// Sets the column width with a certain number of characters.
        /// 
        /// 
        /// 
        /// 
        ISheet SetColumnWidth(int column, float charWidth);
        /// 
        /// Gets the width of a column in characters. Returns float.MinValue if no width has been set.
        /// 
        /// 
        /// 
        float GetColumnWidth(int column);
        /// 
        /// Gets the height of a row in points.
        /// 
        /// 
        /// 
        float GetRowHeight(int row);
        float GetDefaultRowHeight();
        ISheet MergeCells(int firstRow, int lastRow, int firstColumn, int lastColumn);
        IEnumerable GetMergedCells();
        IEnumerable Rows();
        IEnumerator RowEnumerator();
    }
    public interface IRow
    {
        public int RowNumber { get; }
        int FirstColumn { get; }
        int LastColumn { get; }
        ISheet Sheet { get; }
        public ICell this[int column]
        {
            get { return GetCell(column); }
        }
        public string ExtractString(int column, bool uppercase = false);
        public DateTime ExtractDateTime(int column);
        public double? ExtractDouble(int column);
        public int GetColumn(string name, bool throwException = true);
        public ICell? GetCell(int column);
        public ICell NewCell(int column);
        public IEnumerable Cells();
    }
    public interface ICell
    {
        IRow Row { get; }
        CellType GetCellType();
        string GetValue();
        bool? GetBoolValue();
        double? GetDoubleValue();
        DateTime GetDateTimeValue();
        byte? GetByteValue();
        ICell SetValue(bool value);
        ICell SetValue(string value);
        ICell SetValue(double value);
        ICell SetValue(DateTime value);
        ICell SetValue(byte value);
        ICell SetBlank();
        ICellStyle GetStyle();
        ICell SetStyle(ICellStyle style);
    }
    public interface ISpreadsheet
    {
        public ISheet GetSheet(int index);
        public ISheet GetSheet(string name);
        /// 
        /// Make a new sheet and add it to the spreadsheet
        /// 
        /// The name of the new sheet
        /// The new sheet
        public ISheet NewSheet(string name);
        /// 
        /// Make a new sheet and add it to the spreadsheet
        /// 
        /// The new sheet
        public ISheet NewSheet();
        public IEnumerable Sheets();
        public IEnumerator SheetEnumerator();
        public ICellStyle NewStyle();
        public IDataFormat GetDataFormat(string format);
        public void Write(FileStream file);
        public void Write(string filename, FileMode mode = FileMode.Create);
    }
}