using Aspose.Words;
using Aspose.Words.Tables;
using Aspose.Words.Fields;
using System.Text;
namespace OASystem.API.OAMethodLib.FileProcessing
{
    /// 
    /// 文件处理服务,使用Aspose.Words处理Word文档
    /// 
    public class FileProcessingService 
        //: IFileProcessingService
    {
        private readonly ILogger _logger;
        private readonly IConfiguration _configuration;
        public FileProcessingService(
            ILogger logger,
            IConfiguration configuration)
        {
            _logger = logger;
            _configuration = configuration;
            InitializeAsposeLicense();
        }
        /// 
        /// 初始化Aspose.Words许可证
        /// 
        private void InitializeAsposeLicense()
        {
            try
            {
                var licensePath = _configuration["Aspose:LicensePath"];
                if (!string.IsNullOrEmpty(licensePath) && System.IO.File.Exists(licensePath))
                {
                    var license = new License();
                    license.SetLicense(licensePath);
                    _logger.LogInformation("Aspose.Words 15.12.0 许可证已成功加载");
                }
                else
                {
                    _logger.LogWarning("Aspose.Words许可证文件未找到,将使用评估模式");
                }
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Aspose.Words许可证初始化失败");
            }
        }
        ///// 
        ///// 处理Word文档并提取结构化信息
        ///// 
        //public async Task ProcessWordDocumentAsync(IFormFile file)
        //{
        //    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
        //    try
        //    {
        //        _logger.LogInformation("开始处理Word文档: {FileName} ({Size} bytes)",
        //            file.FileName, file.Length);
        //        if (!IsSupportedWordFormat(file.FileName))
        //        {
        //            return new ProcessingResult
        //            {
        //                Success = false,
        //                ErrorMessage = $"不支持的文件格式: {Path.GetExtension(file.FileName)}",
        //                FileSize = file.Length,
        //                FileType = file.ContentType
        //            };
        //        }
        //        using var stream = new MemoryStream();
        //        await file.CopyToAsync(stream);
        //        stream.Position = 0;
        //        var documentInfo = await ExtractDocumentInfoAsync(stream, file.FileName);
        //        stopwatch.Stop();
        //        _logger.LogInformation("Word文档处理完成: {FileName}, 耗时: {ElapsedMs}ms",
        //            file.FileName, stopwatch.ElapsedMilliseconds);
        //        return new ProcessingResult
        //        {
        //            Success = true,
        //            Data = documentInfo,
        //            FileSize = file.Length,
        //            FileType = file.ContentType
        //        };
        //    }
        //    catch (Exception ex)
        //    {
        //        stopwatch.Stop();
        //        _logger.LogError(ex, "Word文档处理失败: {FileName}", file.FileName);
        //        return new ProcessingResult
        //        {
        //            Success = false,
        //            ErrorMessage = $"处理失败: {ex.Message}",
        //            FileSize = file.Length,
        //            FileType = file.ContentType
        //        };
        //    }
        //}
        ///// 
        ///// 批量处理Word文档
        ///// 
        //public async Task> ProcessWordDocumentsAsync(List files)
        //{
        //    var results = new List();
        //    var tasks = files.Select(ProcessWordDocumentAsync).ToList();
        //    var batchResults = await Task.WhenAll(tasks);
        //    results.AddRange(batchResults);
        //    return results;
        //}
        ///// 
        ///// 从流中提取文档信息
        ///// 
        //public async Task ExtractDocumentInfoAsync(Stream stream, string fileName)
        //{
        //    var stopwatch = System.Diagnostics.Stopwatch.StartNew();
        //    try
        //    {
        //        // 加载Word文档
        //        var doc = new Document(stream);
        //        var documentInfo = new WordDocumentInfo
        //        {
        //            Title = ExtractDocumentTitle(doc),
        //            Content = ExtractTextContent(doc),
        //            Metadata = ExtractMetadata(doc),
        //            Tables = ExtractTables(doc),
        //            FormFields = ExtractFormFields(doc),
        //            Sections = ExtractSections(doc),
        //            ImagesCount = CountImages(doc)
        //        };
        //        stopwatch.Stop();
        //        documentInfo.ProcessingTimeMs = stopwatch.ElapsedMilliseconds;
        //        return documentInfo;
        //    }
        //    catch (Exception ex)
        //    {
        //        _logger.LogError(ex, "文档信息提取失败: {FileName}", fileName);
        //        throw;
        //    }
        //}
        ///// 
        ///// 提取文档标题
        ///// 
        //private string ExtractDocumentTitle(Document doc)
        //{
        //    try
        //    {
        //        // 首先尝试从文档属性获取标题
        //        var title = doc.BuiltInDocumentProperties.Title;
        //        if (!string.IsNullOrEmpty(title))
        //            return title;
        //        // 如果没有标题,尝试从第一个段落提取
        //        foreach (Aspose.Words.Paragraph paragraph in doc.GetChildNodes(NodeType.Paragraph, true))
        //        {
        //            var text = paragraph.GetText().Trim();
        //            if (!string.IsNullOrEmpty(text) && text.Length < 100) // 假设标题不会太长
        //                return text;
        //        }
        //        return "未命名文档";
        //    }
        //    catch (Exception ex)
        //    {
        //        _logger.LogWarning(ex, "提取文档标题失败");
        //        return "未命名文档";
        //    }
        //}
        ///// 
        ///// 提取文本内容
        ///// 
        //private string ExtractTextContent(Document doc)
        //{
        //    try
        //    {
        //        // 使用Aspose.Words的GetText方法提取纯文本
        //        return doc.GetText();
        //    }
        //    catch (Exception ex)
        //    {
        //        _logger.LogWarning(ex, "提取文本内容失败");
        //        return string.Empty;
        //    }
        //}
        ///// 
        ///// 提取文档元数据
        ///// 
        //private DocumentMetadata ExtractMetadata(Document doc)
        //{
        //    try
        //    {
        //        var props = doc.BuiltInDocumentProperties;
        //        return new DocumentMetadata
        //        {
        //            Author = props.Author ?? string.Empty,
        //            Company = props.Company ?? string.Empty,
        //            CreatedTime = props.CreatedTime,
        //            LastSavedTime = props.LastSavedTime,
        //            PageCount = doc.PageCount,
        //            WordCount = props.Words,
        //            CharacterCount = props.Characters,
        //            Subject = props.Subject ?? string.Empty,
        //            Keywords = props.Keywords ?? string.Empty
        //        };
        //    }
        //    catch (Exception ex)
        //    {
        //        _logger.LogWarning(ex, "提取元数据失败");
        //        return new DocumentMetadata();
        //    }
        //}
        ///// 
        ///// 提取表格数据
        ///// 
        //private List ExtractTables(Document doc)
        //{
        //    var tables = new List();
        //    try
        //    {
        //        int tableIndex = 1;
        //        foreach (Aspose.Words.Tables.Table table in doc.GetChildNodes(NodeType.Table, true))
        //        {
        //            var docTable = new DocumentTable
        //            {
        //                TableName = $"表格_{tableIndex}"
        //            };
        //            // 提取表头(假设第一行是表头)
        //            if (table.Rows.Count > 0)
        //            {
        //                var firstRow = table.FirstRow;
        //                foreach (Cell cell in firstRow.Cells)
        //                {
        //                    docTable.Headers.Add(cell.GetText().Trim());
        //                }
        //            }
        //            // 提取所有行数据
        //            foreach (Row row in table.Rows)
        //            {
        //                var rowData = new List();
        //                foreach (Cell cell in row.Cells)
        //                {
        //                    rowData.Add(cell.GetText().Trim());
        //                }
        //                docTable.Rows.Add(rowData);
        //            }
        //            tables.Add(docTable);
        //            tableIndex++;
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        _logger.LogWarning(ex, "提取表格数据失败");
        //    }
        //    return tables;
        //}
        ///// 
        ///// 提取表单字段(兼容Aspose.Words 15.12.0)
        ///// 
        //private List ExtractFormFields(Document doc)
        //{
        //    var formFields = new List();
        //    try
        //    {
        //        // 获取文档中的所有表单字段
        //        var formFieldCollection = doc.Range.FormFields;
        //        for (int i = 0; i < formFieldCollection.Count; i++)
        //        {
        //            var formField = formFieldCollection[i];
        //            var extractedField = ExtractFormFieldInfo(formField);
        //            if (extractedField != null)
        //            {
        //                formFields.Add(extractedField);
        //            }
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        _logger.LogWarning(ex, "提取表单字段失败");
        //    }
        //    return formFields;
        //}
        ///// 
        ///// 提取单个表单字段的详细信息
        ///// 
        //private FormField ExtractFormFieldInfo(Aspose.Words.Fields.FormField formField)
        //{
        //    try
        //    {
        //        var field = new FormField
        //        {
        //            Name = GetFormFieldName(formField),
        //            Type = GetFormFieldType(formField),
        //            Value = GetFormFieldValue(formField),
        //            IsChecked = IsFormFieldChecked(formField),
        //            Status = GetFormFieldStatus(formField),
        //            DefaultValue = GetFormFieldDefaultValue(formField),
        //            MaxLength = GetFormFieldMaxLength(formField),
        //            Options = GetFormFieldOptions(formField)
        //        };
        //        return field;
        //    }
        //    catch (Exception ex)
        //    {
        //        _logger.LogWarning(ex, "提取表单字段信息失败: {FieldName}", formField.Name);
        //        return null;
        //    }
        //}
        ///// 
        ///// 获取表单字段名称
        ///// 
        //private string GetFormFieldName(Aspose.Words.Fields.FormField formField)
        //{
        //    try
        //    {
        //        return !string.IsNullOrEmpty(formField.Name) ? formField.Name : "未命名字段";
        //    }
        //    catch
        //    {
        //        return "未知字段";
        //    }
        //}
        ///// 
        ///// 获取表单字段类型
        ///// 
        //private string GetFormFieldType(Aspose.Words.Fields.FormField formField)
        //{
        //    try
        //    {
        //        return formField.Type switch
        //        {
        //            FormFieldType.Regular => "常规文本",
        //            FormFieldType.CheckBox => "复选框",
        //            FormFieldType.DropDown => "下拉列表",
        //            _ => "未知类型"
        //        };
        //    }
        //    catch
        //    {
        //        return "未知类型";
        //    }
        //}
        ///// 
        ///// 获取表单字段值
        ///// 
        //private string GetFormFieldValue(Aspose.Words.Fields.FormField formField)
        //{
        //    try
        //    {
        //        // 对于15.12.0版本,使用GetFieldCode()和其他方法获取值
        //        switch (formField.Type)
        //        {
        //            case FormFieldType.CheckBox:
        //                return IsFormFieldChecked(formField) ? "选中" : "未选中";
        //            case FormFieldType.DropDown:
        //                return GetDropDownSelectedValue(formField);
        //            case FormFieldType.Regular:
        //                return GetTextFormFieldValue(formField);
        //            default:
        //                return string.Empty;
        //        }
        //    }
        //    catch
        //    {
        //        return string.Empty;
        //    }
        //}
        ///// 
        ///// 检查复选框是否被选中
        ///// 
        //private bool IsFormFieldChecked(Aspose.Words.Fields.FormField formField)
        //{
        //    try
        //    {
        //        if (formField.Type != FormFieldType.CheckBox)
        //            return false;
        //        // 在15.12.0版本中,通过检查字段代码来判断复选框状态
        //        var fieldCode = formField.GetFieldCode() ?? string.Empty;
        //        // 检查常见的复选框选中标记
        //        return fieldCode.Contains("\\checked", StringComparison.OrdinalIgnoreCase) ||
        //               fieldCode.Contains("✓", StringComparison.OrdinalIgnoreCase) ||
        //               fieldCode.Contains("☑", StringComparison.OrdinalIgnoreCase);
        //    }
        //    catch
        //    {
        //        return false;
        //    }
        //}
        ///// 
        ///// 获取下拉列表选中的值
        ///// 
        //private string GetDropDownSelectedValue(Aspose.Words.Fields.FormField formField)
        //{
        //    try
        //    {
        //        if (formField.Type != FormFieldType.DropDown)
        //            return string.Empty;
        //        // 在15.12.0中,可能需要通过解析字段代码来获取选中的值
        //        var fieldCode = formField.GetFieldCode() ?? string.Empty;
        //        // 简单的解析逻辑 - 实际应用中可能需要更复杂的解析
        //        if (fieldCode.Contains("\\s", StringComparison.OrdinalIgnoreCase))
        //        {
        //            var match = System.Text.RegularExpressions.Regex.Match(
        //                fieldCode,
        //                @"\\s\s*""([^""]*)""",
        //                System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        //            if (match.Success)
        //            {
        //                return match.Groups[1].Value;
        //            }
        //        }
        //        return "未选择";
        //    }
        //    catch
        //    {
        //        return string.Empty;
        //    }
        //}
        ///// 
        ///// 获取文本表单字段的值
        ///// 
        //private string GetTextFormFieldValue(Aspose.Words.Fields.FormField formField)
        //{
        //    try
        //    {
        //        if (formField.Type != FormFieldType.Regular)
        //            return string.Empty;
        //        // 对于文本字段,尝试获取字段结果文本
        //        // 在15.12.0中,可能需要遍历字段的子节点
        //        var result = string.Empty;
        //        // 尝试获取字段的文本内容
        //        var fieldNodes = formField.GetChildNodes(NodeType.Any, true);
        //        foreach (Aspose.Words.Node node in fieldNodes)
        //        {
        //            if (node.NodeType == NodeType.Run)
        //            {
        //                result += ((Run)node).Text;
        //            }
        //        }
        //        return result.Trim();
        //    }
        //    catch
        //    {
        //        return string.Empty;
        //    }
        //}
        ///// 
        ///// 获取表单字段状态
        ///// 
        //private string GetFormFieldStatus(Aspose.Words.Fields.FormField formField)
        //{
        //    try
        //    {
        //        var fieldCode = formField.GetFieldCode() ?? string.Empty;
        //        if (fieldCode.Contains("\\locked", StringComparison.OrdinalIgnoreCase))
        //            return "已锁定";
        //        if (fieldCode.Contains("\\disabled", StringComparison.OrdinalIgnoreCase))
        //            return "已禁用";
        //        return "活动";
        //    }
        //    catch
        //    {
        //        return "未知";
        //    }
        //}
        ///// 
        ///// 获取表单字段默认值
        ///// 
        //private string GetFormFieldDefaultValue(Aspose.Words.Fields.FormField formField)
        //{
        //    try
        //    {
        //        var fieldCode = formField.GetFieldCode() ?? string.Empty;
        //        // 解析默认值
        //        var match = System.Text.RegularExpressions.Regex.Match(
        //            fieldCode,
        //            @"\\d\s*""([^""]*)""",
        //            System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        //        if (match.Success)
        //        {
        //            return match.Groups[1].Value;
        //        }
        //        return string.Empty;
        //    }
        //    catch
        //    {
        //        return string.Empty;
        //    }
        //}
        ///// 
        ///// 获取表单字段最大长度
        ///// 
        //private int GetFormFieldMaxLength(Aspose.Words.Fields.FormField formField)
        //{
        //    try
        //    {
        //        var fieldCode = formField.GetFieldCode() ?? string.Empty;
        //        var match = System.Text.RegularExpressions.Regex.Match(
        //            fieldCode,
        //            @"\\l\s*(\d+)",
        //            System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        //        if (match.Success && int.TryParse(match.Groups[1].Value, out int maxLength))
        //        {
        //            return maxLength;
        //        }
        //        return 0;
        //    }
        //    catch
        //    {
        //        return 0;
        //    }
        //}
        ///// 
        ///// 获取下拉列表选项
        ///// 
        //private List GetFormFieldOptions(Aspose.Words.Fields.FormField formField)
        //{
        //    var options = new List();
        //    try
        //    {
        //        if (formField.Type != FormFieldType.DropDown)
        //            return options;
        //        var fieldCode = formField.GetFieldCode() ?? string.Empty;
        //        // 解析下拉选项
        //        var matches = System.Text.RegularExpressions.Regex.Matches(
        //            fieldCode,
        //            @"""([^""]*)""",
        //            System.Text.RegularExpressions.RegexOptions.IgnoreCase);
        //        foreach (System.Text.RegularExpressions.Match match in matches)
        //        {
        //            if (match.Success)
        //            {
        //                options.Add(match.Groups[1].Value);
        //            }
        //        }
        //        return options;
        //    }
        //    catch
        //    {
        //        return options;
        //    }
        ///// 
        ///// 统计图片数量
        ///// 
        //private int CountImages(Document doc)
        //{
        //    try
        //    {
        //        int imageCount = 0;
        //        foreach (Aspose.Words.Drawing.Shape shape in doc.GetChildNodes(NodeType.Shape, true))
        //        {
        //            if (shape.HasImage)
        //            {
        //                imageCount++;
        //            }
        //        }
        //        return imageCount;
        //    }
        //    catch (Exception ex)
        //    {
        //        _logger.LogWarning(ex, "统计图片数量失败");
        //        return 0;
        //    }
        //}
        ///// 
        ///// 检查文件是否为支持的Word格式
        ///// 
        //public bool IsSupportedWordFormat(string fileName)
        //{
        //    var extension = Path.GetExtension(fileName).ToLower();
        //    return extension switch
        //    {
        //        ".doc" => true,
        //        ".docx" => true,
        //        ".dot" => true,
        //        ".dotx" => true,
        //        ".docm" => true,
        //        ".dotm" => true,
        //        _ => false
        //    };
        //}
    }
}