using Microsoft.AspNetCore.Mvc;
using QYZH.InteractiveMagazine.IService;
using QYZH.InteractiveMagazine.Models.Common;
using QYZH.InteractiveMagazine.Models.Dto;

namespace QYZH.InteractiveMagazine.WeChatApi.Controllers;

/// <summary>
/// 小程序社区控制器
/// </summary>
public class CommunityController(IWeChatCommunityService communityService, ILogger<CommunityController> logger) : WeChatBaseController
{
    /// <summary>
    /// 获取社区Feed流（翻页）
    /// </summary>
    /// <param name="cursor">游标（上一页最后一条消息ID，首次不传）</param>
    [HttpGet("feed")]
    public async Task<BaseResponse<WxFeedOutput>> GetFeed([FromQuery] long? cursor = null)
    {
        try
        {
            var userId = GetCurrentUserId();
            if (userId == 0)
            {
                return BaseResponse<WxFeedOutput>.Fail(ResultCode.DENY, "未获取到用户信息");
            }

            var result = await communityService.GetFeedAsync(userId, cursor);
            return Success(result);
        }
        catch (BusinessException ex)
        {
            logger.LogWarning(ex, "获取社区Feed业务异常: {Message}", ex.Message);
            return BaseResponse<WxFeedOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "获取社区Feed系统异常");
            return BaseResponse<WxFeedOutput>.Fail("获取社区内容失败，请稍后重试");
        }
    }

    /// <summary>
    /// 下拉刷新社区Feed
    /// </summary>
    [HttpGet("refresh")]
    public async Task<BaseResponse<WxFeedOutput>> RefreshFeed()
    {
        try
        {
            var userId = GetCurrentUserId();
            if (userId == 0)
            {
                return BaseResponse<WxFeedOutput>.Fail(ResultCode.DENY, "未获取到用户信息");
            }

            var result = await communityService.RefreshFeedAsync(userId);
            return Success(result);
        }
        catch (BusinessException ex)
        {
            logger.LogWarning(ex, "刷新社区Feed业务异常: {Message}", ex.Message);
            return BaseResponse<WxFeedOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "刷新社区Feed系统异常");
            return BaseResponse<WxFeedOutput>.Fail("刷新社区内容失败，请稍后重试");
        }
    }

    /// <summary>
    /// 点赞
    /// </summary>
    [HttpPost("like")]
    public async Task<BaseResponse<WxLikeOutput>> Like([FromBody] WxLikeInput input)
    {
        try
        {
            var userId = GetCurrentUserId();
            if (userId == 0)
            {
                return BaseResponse<WxLikeOutput>.Fail(ResultCode.DENY, "未获取到用户信息");
            }

            var result = await communityService.LikeAsync(userId, input);
            return Success(result, "点赞成功");
        }
        catch (BusinessException ex)
        {
            logger.LogWarning(ex, "点赞业务异常: {Message}", ex.Message);
            return BaseResponse<WxLikeOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "点赞系统异常，参数：{Input}", input);
            return BaseResponse<WxLikeOutput>.Fail("点赞失败，请稍后重试");
        }
    }

    /// <summary>
    /// 取消点赞
    /// </summary>
    [HttpPost("unlike")]
    public async Task<BaseResponse<WxLikeOutput>> Unlike([FromBody] WxLikeInput input)
    {
        try
        {
            var userId = GetCurrentUserId();
            if (userId == 0)
            {
                return BaseResponse<WxLikeOutput>.Fail(ResultCode.DENY, "未获取到用户信息");
            }

            var result = await communityService.UnlikeAsync(userId, input.MessageId);
            return Success(result, "已取消点赞");
        }
        catch (BusinessException ex)
        {
            logger.LogWarning(ex, "取消点赞业务异常: {Message}", ex.Message);
            return BaseResponse<WxLikeOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "取消点赞系统异常，参数：{Input}", input);
            return BaseResponse<WxLikeOutput>.Fail("取消点赞失败，请稍后重试");
        }
    }
}
