/*
<copyright file="BGExcelImageProcessorImport.cs" company="BansheeGz">
    Copyright (c) 2018-2024 All Rights Reserved
</copyright>
*/

using System;
using System.IO;
using NPOI.XSSF.UserModel;
using UnityEngine;

namespace BansheeGz.BGDatabase.Editor
{
    public class BGExcelImageProcessorImport
    {
        public void Process(BGExcelImageProcessorImportRequest request)
        {
            var newAssetsContainer = new BGExcelImageNewAssetsContainer();
            request.assetsConfig.ForEachImageField(request.repo, false, field =>
            {
                var sheetInfo = request.bookInfo.GetEntitySheet(field.MetaId);
                if (sheetInfo == null) return;
                var column = sheetInfo.GetFieldColumn(field.Id);
                if (column < 0) return;
                var sheet = (XSSFSheet)request.book.GetSheetAt(sheetInfo.SheetNumber);
                int updatedCount = 0, skippedCount = 0;


                var drawing = sheet.DrawingPatriarch;
                if (!(drawing is XSSFDrawing xssfDrawing)) return;

                var imageField = new BGExcelImageField(field);
                var onInvalidReference = request.assetsConfig.GetFieldOnInvalidReference(field.Id);
                var onEmptyReference = request.assetsConfig.GetFieldOnEmptyReference(field.Id);
                var newAssetFolderConfig = request.assetsConfig.GetNewAssetFolder(field.Id);
                var newFolderValid = !string.IsNullOrEmpty(newAssetFolderConfig) && Directory.Exists(newAssetFolderConfig);

                var newAssets = new BGExcelImageNewAssetsContainer.NewFieldAssets(newAssetsContainer, imageField, request.assetsConfig);

                var shapes = xssfDrawing.GetShapes();
                foreach (var shape in shapes)
                {
                    if (!(shape is XSSFPicture xssfPicture)) continue;
                    var anchor = xssfPicture.GetAnchor();
                    if (!(anchor is XSSFClientAnchor xssfAnchor)) continue;
                    if (xssfAnchor.Col1 != column) continue;
                    if (BGExcelImageAsset.GetExtension(xssfPicture.PictureData.PictureType) == null) continue;
                    var entityId = sheetInfo.GetRowId(xssfAnchor.Row1);
                    if (entityId.IsEmpty) continue;
                    var entity = field.Meta.GetEntity(entityId);
                    if (entity == null) continue;

                    var asset = new BGExcelImageAsset(imageField, entity);
                    if (asset.NoValue)
                    {
                        if (onEmptyReference == BGSyncAssetsConfig.BGSyncAssetsInvalidReferenceEnum.CreateNew && newFolderValid)
                            newAssets.Add(new BGExcelImageNewAssetsContainer.ExcelImage(asset.entity, xssfPicture));
                        else skippedCount++;
                    }
                    else
                    {
                        if (!asset.IsValid || xssfPicture.PictureData.PictureType != asset.pictureType)
                        {
                            if (onInvalidReference == BGSyncAssetsConfig.BGSyncAssetsInvalidReferenceEnum.CreateNew && newFolderValid)
                                newAssets.Add(new BGExcelImageNewAssetsContainer.ExcelImage(asset.entity, xssfPicture));
                            else skippedCount++;
                        }
                        else
                        {
                            //rewrite the original image
                            try
                            {
                                asset.Content = xssfPicture.PictureData.Data;
                            }
                            catch (Exception)
                            {
                                Debug.LogError($"Error while replacing Unity image asset, field={field.FullName}, " +
                                               $"entity #={entity.Index}, entity name={BGEditorUtility.GetEntityName(entity)}");
                                throw;
                            }
                            updatedCount++;
                        }
                    }
                }

                request.logger.AppendLine($"Field {field.FullName}. {updatedCount} images updated. {newAssets.NewImages.Count} images created." +
                                          $" {skippedCount} images skipped.");
            });
            newAssetsContainer.Complete();
        }
    }
}