using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using QYZH.InteractiveMagazine.IService;

using QYZH.InteractiveMagazine.Models.Common;
using QYZH.InteractiveMagazine.Models.Dto;
using QYZH.InteractiveMagazine.Models.WeChat;

namespace QYZH.InteractiveMagazine.WeChatApi.Controllers;

/// <summary>
/// 微信小程序认证控制器
/// </summary>
public class WeChatAuthController : WeChatBaseController
{
    private readonly IWeChatAuthService _weChatAuthService;
    private readonly ILogger<WeChatAuthController> _logger;

    public WeChatAuthController(IWeChatAuthService weChatAuthService, ILogger<WeChatAuthController> logger)
    {
        _weChatAuthService = weChatAuthService;
        _logger = logger;
    }

    /// <summary>
    /// 微信小程序登录（首次仅创建 WxUser，不自动创建 User）
    /// </summary>
    /// <param name="input">登录输入（含微信 code 和可选的手机号 code）</param>
    /// <returns>登录结果（含 Token 和用户列表）</returns>
    [AllowAnonymous]
    [HttpPost("login")]
    public async Task<BaseResponse<WeChatLoginOutput>> LoginAsync([FromBody] WeChatLoginInput input)
    {
        try
        {
            var result = await _weChatAuthService.LoginAsync(input);
            return Success(result);
        }
        catch (BusinessException ex)
        {
            _logger.LogWarning(ex, "微信登录业务异常: {Message}", ex.Message);
            return BaseResponse<WeChatLoginOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "微信登录系统异常");
            return BaseResponse<WeChatLoginOutput>.Fail("微信登录失败，请稍后重试");
        }
    }

    /// <summary>
    /// 微信小程序快捷登录（通过 OpenId 直接登录，用户需已存在）
    /// </summary>
    /// <param name="input">快捷登录输入（含 OpenId）</param>
    /// <returns>登录结果（含 Token 和用户列表）</returns>
    [AllowAnonymous]
    [HttpPost("quickLogin")]
    public async Task<BaseResponse<WeChatLoginOutput>> QuickLoginAsync([FromBody] WeChatQuickLoginInput input)
    {
        try
        {
            var result = await _weChatAuthService.QuickLoginAsync(input);
            return Success(result);
        }
        catch (BusinessException ex)
        {
            _logger.LogWarning(ex, "微信快捷登录业务异常: {Message}", ex.Message);
            return BaseResponse<WeChatLoginOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "微信快捷登录系统异常");
            return BaseResponse<WeChatLoginOutput>.Fail("快捷登录失败，请稍后重试");
        }
    }

    /// <summary>
    /// 切换用户（同一 WxUser 下切换 User 身份）
    /// </summary>
    [HttpPost("switchUser")]
    public async Task<BaseResponse<WeChatSwitchUserOutput>> SwitchUserAsync([FromBody] WeChatSwitchUserInput input)
    {
        try
        {
            var wxUserId = GetCurrentWxUserId();
            if (wxUserId == null)
                return BaseResponse<WeChatSwitchUserOutput>.Fail(ResultCode.DENY, "未获取到用户信息");

            var currentUserId = GetCurrentUserId();
            var result = await _weChatAuthService.SwitchUserAsync(wxUserId.Value, currentUserId, input);
            return Success(result);
        }
        catch (BusinessException ex)
        {
            _logger.LogWarning(ex, "切换用户业务异常: {Message}", ex.Message);
            return BaseResponse<WeChatSwitchUserOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "切换用户系统异常");
            return BaseResponse<WeChatSwitchUserOutput>.Fail("切换用户失败，请稍后重试");
        }
    }

    /// <summary>
    /// 获取当前微信用户下的所有用户列表
    /// </summary>
    [HttpGet("users")]
    public async Task<BaseResponse<List<WxUserOutput>>> GetUsersAsync()
    {
        try
        {
            var wxUserId = GetCurrentWxUserId();
            if (wxUserId == null)
                return BaseResponse<List<WxUserOutput>>.Fail(ResultCode.DENY, "未获取到用户信息");

            var result = await _weChatAuthService.GetUsersAsync(wxUserId.Value);
            return Success(result);
        }
        catch (BusinessException ex)
        {
            _logger.LogWarning(ex, "获取用户列表业务异常: {Message}", ex.Message);
            return BaseResponse<List<WxUserOutput>>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "获取用户列表系统异常");
            return BaseResponse<List<WxUserOutput>>.Fail("获取用户列表失败，请稍后重试");
        }
    }

    /// <summary>
    /// 在当前微信用户下新增用户（子用户/角色）
    /// </summary>
    [HttpPost("createUser")]
    public async Task<BaseResponse<WxUserOutput>> CreateUserAsync([FromBody] CreateChildUserInput input)
    {
        try
        {
            var wxUserId = GetCurrentWxUserId();
            if (wxUserId == null)
                return BaseResponse<WxUserOutput>.Fail(ResultCode.DENY, "未获取到用户信息");

            var result = await _weChatAuthService.CreateUserAsync(wxUserId.Value, input);
            return Success(result);
        }
        catch (BusinessException ex)
        {
            _logger.LogWarning(ex, "新增用户业务异常: {Message}", ex.Message);
            return BaseResponse<WxUserOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "新增用户系统异常");
            return BaseResponse<WxUserOutput>.Fail("新增用户失败，请稍后重试");
        }
    }

    /// <summary>
    /// 修改家长名字（WxUser.Name）
    /// </summary>
    [HttpPost("updateName")]
    public async Task<BaseResponse<WxUserInfoOutput>> UpdateWxUserNameAsync([FromBody] UpdateWxUserNameInput input)
    {
        try
        {
            var wxUserId = GetCurrentWxUserId();
            if (wxUserId == null)
                return BaseResponse<WxUserInfoOutput>.Fail(ResultCode.DENY, "未获取到用户信息");

            var result = await _weChatAuthService.UpdateWxUserNameAsync(wxUserId.Value, input);
            return Success(result, "修改成功");
        }
        catch (BusinessException ex)
        {
            _logger.LogWarning(ex, "修改家长名字业务异常: {Message}", ex.Message);
            return BaseResponse<WxUserInfoOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "修改家长名字系统异常");
            return BaseResponse<WxUserInfoOutput>.Fail("修改家长名字失败，请稍后重试");
        }
    }
}
