using CloudBuilder.Core.Service;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace CloudBuilder.Core.DatabaseAccessor
{
    /*
        事务范围：TransactionScopeOption.RequiresNew 管理的是分布式事务，
                  TransactionScopeOption.Required但对于单个数据库连接，通常不需要分布式事务。
        OnActionExecutionAsync 是 ASP.NET Core 中异步的 Action 过滤器执行方法。
        // OnActionExecuting: Action 执行前
        [开始事务]
        ↓
        [Action 方法执行]
        ↓
        // OnActionExecuted: Action 执行后（无论是否异常）
        [检查异常]
        //Controller对象不抛出异常，返回的是异常对象ValidatedException、ServiceErrorException（方便前端信息统一处理）
        [提交或回滚事务]
     */
    [AttributeUsage(AttributeTargets.Method)]
    public class UnitOfWorkAttribute : ActionFilterAttribute
    {
        private TransactionScope _transactionScope;

        public override void OnActionExecuting(ActionExecutingContext context)
        {
            _transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew,
                new TransactionOptions
                {
                    IsolationLevel = IsolationLevel.ReadCommitted,
                    Timeout = TransactionManager.MaximumTimeout
                });

            base.OnActionExecuting(context);
        }

        //public override void OnActionExecuting(ActionExecutingContext context)
        //{
        //    // 正确：单机数据库事务（不是分布式）
        //    _transactionScope = new TransactionScope(
        //        TransactionScopeOption.Required,
        //        new TransactionOptions
        //        {
        //            IsolationLevel = IsolationLevel.ReadCommitted
        //        },
        //        TransactionScopeAsyncFlowOption.Enabled); // 必须加这个

        //    base.OnActionExecuting(context);
        //}

        public override void OnActionExecuted(ActionExecutedContext context)
        {
            if (_transactionScope == null)
            {
                base.OnActionExecuted(context);
                return;
            }

            bool needRollback = false;

            try
            {
                // ==============================================
                // 核心逻辑：判断返回值是不是异常对象
                // ==============================================
                if (context.Result is ObjectResult objectResult)
                {
                    var value = objectResult.Value;

                    if (value != null)
                    {
                        // 只要是这两个异常 → 必须回滚
                        if (value is ValidatedException || value is ServiceErrorException)
                        {
                            needRollback = true;
                        }
                    }
                }

                // 如果没有异常，才提交
                if (!needRollback)
                {
                    //必须要有 SaveChanges() 调用，否则数据只会停留在内存中，不会真正保存到数据库。
                    _transactionScope.Complete();
                }
            }
            finally
            {
                // 不 Complete() 就是自动回滚
                _transactionScope.Dispose();
            }

            base.OnActionExecuted(context);
        }
    }
}
