// src/controllers/user.controller.js
// 사용자 컨트롤러

const { User, UsageLog } = require('../models');
const logger = require('../config/logger.config');

/**
 * 내 정보 조회
 */
exports.getMe = async (req, res, next) => {
  try {
    const user = await User.findByPk(req.user.userId);
    if (!user) {
      return res.status(404).json({
        success: false,
        error: {
          code: 'USER_NOT_FOUND',
          message: '사용자를 찾을 수 없습니다.',
        },
      });
    }

    // 이번 달 사용량 조회
    const now = new Date();
    const monthlyUsage = await UsageLog.getMonthlyTotalByUser(
      user.id,
      now.getFullYear(),
      now.getMonth() + 1
    );

    return res.json({
      success: true,
      data: {
        ...user.toSafeJSON(),
        usage: {
          monthly: monthlyUsage,
          limit: user.monthlyTokenLimit,
          remaining: Math.max(0, user.monthlyTokenLimit - monthlyUsage.totalTokens),
        },
      },
    });
  } catch (error) {
    return next(error);
  }
};

/**
 * 내 정보 수정
 */
exports.updateMe = async (req, res, next) => {
  try {
    const { name, password } = req.body;

    const user = await User.findByPk(req.user.userId);
    if (!user) {
      return res.status(404).json({
        success: false,
        error: {
          code: 'USER_NOT_FOUND',
          message: '사용자를 찾을 수 없습니다.',
        },
      });
    }

    // 업데이트할 필드만 설정
    if (name) user.name = name;
    if (password) user.password = password;

    await user.save();

    logger.info(`사용자 정보 수정: ${user.email}`);

    return res.json({
      success: true,
      data: user.toSafeJSON(),
    });
  } catch (error) {
    return next(error);
  }
};

/**
 * 계정 삭제
 */
exports.deleteMe = async (req, res, next) => {
  try {
    const user = await User.findByPk(req.user.userId);
    if (!user) {
      return res.status(404).json({
        success: false,
        error: {
          code: 'USER_NOT_FOUND',
          message: '사용자를 찾을 수 없습니다.',
        },
      });
    }

    // 소프트 삭제 (상태 변경)
    user.status = 'inactive';
    await user.save();

    logger.info(`사용자 계정 삭제: ${user.email}`);

    return res.json({
      success: true,
      data: {
        message: '계정이 삭제되었습니다.',
      },
    });
  } catch (error) {
    return next(error);
  }
};
