import { Request, Response } from 'express';
import RewardCatalog from '../models/rewardCatalog';
import { sendResponse, handleError } from '../utils/apiResponse';

// @desc    Create a new reward
// @route   POST /api/admin/rewards
export const createReward = async (req: Request, res: Response): Promise<void> => {
  try {
    const { name, description, type, points_required, quantity, is_active } = req.body;
    let image_url = req.body.image_url || '';

    // If file uploaded, upload to Cloudinary
    if (req.file) {
      const cloudinary = (await import('../config/cloudinary')).default;
      const base64 = req.file.buffer.toString('base64');
      const dataUri = `data:${req.file.mimetype};base64,${base64}`;
      const result = await cloudinary.uploader.upload(dataUri, {
        folder: 'rewards',
        transformation: [ { width: 400, height: 400, crop: 'limit' } ],
      });
      image_url = result.secure_url;
    }

    const reward = await RewardCatalog.create({
      name,
      description,
      type,
      points_required,
      quantity,
      image_url,
      is_active,
    });
    sendResponse(res, 201, 'Reward created', { reward });
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Update a reward
// @route   PUT /api/admin/rewards/:id
export const updateReward = async (req: Request, res: Response): Promise<void> => {
  try {
    const { id } = req.params;
    const update = req.body;
    const reward = await RewardCatalog.findByIdAndUpdate(id, update, { new: true });
    if (!reward) return sendResponse(res, 404, 'Reward not found');
    sendResponse(res, 200, 'Reward updated', { reward });
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    Delete a reward
// @route   DELETE /api/admin/rewards/:id
export const deleteReward = async (req: Request, res: Response): Promise<void> => {
  try {
    const { id } = req.params;
    const reward = await RewardCatalog.findByIdAndDelete(id);
    if (!reward) return sendResponse(res, 404, 'Reward not found');
    sendResponse(res, 200, 'Reward deleted');
  } catch (error) {
    handleError(res, error);
  }
};

// @desc    List all rewards
// @route   GET /api/admin/rewards
export const listRewards = async (req: Request, res: Response): Promise<void> => {
  try {
    const rewards = await RewardCatalog.find().sort({ createdAt: -1 });
    sendResponse(res, 200, 'Rewards fetched', { rewards });
  } catch (error) {
    handleError(res, error);
  }
};
