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

using QYZH.InteractiveMagazine.Models.Common;
using QYZH.InteractiveMagazine.Models.Dto;
using QYZH.InteractiveMagazine.Models.Dto.CheckIn;
using QYZH.InteractiveMagazine.Models.Dto.Compensation;
using QYZH.InteractiveMagazine.Models.Dto.Points;

namespace QYZH.InteractiveMagazine.WebApi.Controllers;

/// <summary>
/// 用户控制器
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class UsersController : BaseController
{
    private readonly IUsersService _usersService;
    private readonly ILogger<UsersController> _logger;

    public UsersController(IUsersService usersService, ILogger<UsersController> logger)
    {
        _usersService = usersService;
        _logger = logger;
    }

    /// <summary>
    /// 获取用户列表（分页）
    /// </summary>
    [HttpGet]
    public async Task<BaseResponse<PageListModel<UsersOutput>>> GetList([FromQuery] UsersQueryInput input)
    {
        return await _usersService.GetListAsync(input);
    }

    /// <summary>
    /// 获取用户详情（仅基本信息）
    /// </summary>
    [HttpGet("{id}")]
    public async Task<BaseResponse<UserDetailOutput>> GetDetail(long id)
    {
        return await _usersService.GetDetailAsync(id);
    }

    /// <summary>
    /// 分页查询用户积分记录
    /// </summary>
    [HttpGet("{id}/pointsRecords")]
    public async Task<BaseResponse<PageListModel<PointsRecordOutput>>> GetUserPointsRecords(long id, [FromQuery] PointsRecordQueryInput input)
    {
        return await _usersService.GetUserPointsRecordsAsync(id, input);
    }

    /// <summary>
    /// 分页查询用户签到记录
    /// </summary>
    [HttpGet("{id}/checkInRecords")]
    public async Task<BaseResponse<PageListModel<CheckInRecordOutput>>> GetUserCheckInRecords(long id, [FromQuery] PageQueryModel input)
    {
        return await _usersService.GetUserCheckInRecordsAsync(id, input);
    }

    /// <summary>
    /// 分页查询用户补偿任务
    /// </summary>
    [HttpGet("{id}/compensationTasks")]
    public async Task<BaseResponse<PageListModel<CompensationTaskOutput>>> GetUserCompensationTasks(long id, [FromQuery] CompensationTaskQueryInput input)
    {
        return await _usersService.GetUserCompensationTasksAsync(id, input);
    }

    /// <summary>
    /// 分页查询用户期刊列表
    /// </summary>
    [HttpGet("{id}/journals")]
    public async Task<BaseResponse<PageListModel<UserJournalItemOutput>>> GetUserJournals(long id, [FromQuery] UserJournalQueryInput input)
    {
        return await _usersService.GetUserJournalsAsync(id, input);
    }

    /// <summary>
    /// 更新用户状态
    /// </summary>
    [HttpPut("{id}/status")]
    public async Task<BaseResponse> UpdateStatus(long id)
    {
        return await _usersService.UpdateStatusAsync(id);
    }

    /// <summary>
    /// 手动增加用户积分
    /// </summary>
    [HttpPost("{userId}/points/add")]
    public async Task<BaseResponse<ManualPointsOutput>> ManualAddPoints(long userId, [FromBody] ManualAddPointsInput input)
    {
        try
        {
            var operatorId = GetCurrentUserId() ?? 0;
            var operatorName = GetCurrentUserName() ?? "Unknown";
            var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();

            var result = await _usersService.ManualAddPointsAsync(userId, input, operatorId, operatorName, ipAddress);
            return Success(result, "手动增加积分成功");
        }
        catch (BusinessException ex)
        {
            _logger.LogWarning(ex, "手动增加积分业务异常: {Message}", ex.Message);
            return BaseResponse<ManualPointsOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "手动增加积分系统异常，UserId: {UserId}", userId);
            return BaseResponse<ManualPointsOutput>.Fail("手动增加积分失败，请稍后重试");
        }
    }

    /// <summary>
    /// 手动扣除用户积分
    /// </summary>
    [HttpPost("{userId}/points/deduct")]
    public async Task<BaseResponse<ManualPointsOutput>> ManualDeductPoints(long userId, [FromBody] ManualDeductPointsInput input)
    {
        try
        {
            var operatorId = GetCurrentUserId() ?? 0;
            var operatorName = GetCurrentUserName() ?? "Unknown";
            var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();

            var result = await _usersService.ManualDeductPointsAsync(userId, input, operatorId, operatorName, ipAddress);
            return Success(result, "手动扣除积分成功");
        }
        catch (BusinessException ex)
        {
            _logger.LogWarning(ex, "手动扣除积分业务异常: {Message}", ex.Message);
            return BaseResponse<ManualPointsOutput>.Fail(ex.Message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "手动扣除积分系统异常，UserId: {UserId}", userId);
            return BaseResponse<ManualPointsOutput>.Fail("手动扣除积分失败，请稍后重试");
        }
    }
}
