import { Router, Response, Request } from 'express';
import { BonusPoints } from '../models/index.js';
import { authenticate, requireRole, AuthRequest } from '../middleware/auth.js';

const router = Router();

const defaultData = {
  heroTitle: { en: 'Bonus Points', zh: '積分獎賞' },
  heroSubtitle: {
    en: 'Earn 1 Bonus Point for every $1 spent with your card. Accumulate Bonus Points to redeem a wide range of exclusive golf-related products and elevate your golfing experience!',
    zh: '每消費$1即可賺取1積分。累積積分可兌換各種獨家高爾夫相關產品，提升您的高爾夫體驗！',
  },
  highlights: [],
  ctaTitle: { en: 'Enjoy Golf ID Now!', zh: '立即尊享高球証！' },
  ctaHotline: '(852) 3582-3088',
  ctaButtonText: { en: 'Enjoy Golf ID', zh: '尊享高球証' },
  ctaButtonLink: 'https://golfcard.com.hk/register',
  products: [
    { brand: { en: 'GLG', zh: 'GLG' }, name: { en: 'Portable Folding Fan', zh: '便攜摺扇' }, pointsRequired: '5,000' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'Golf Divot Repair Tool', zh: '高爾夫果嶺叉草皮修理工具' }, pointsRequired: '40,000' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'High Crown Visor', zh: 'High Crown Visor' }, pointsRequired: '45,000' },
    { brand: { en: 'GLG', zh: 'GLG' }, name: { en: 'Limited Edition Golf Balls', zh: '限量版高爾夫球' }, pointsRequired: '60,000' },
    { brand: { en: 'Snell Golf', zh: 'Snell Golf' }, name: { en: 'PRIME 2.0', zh: 'PRIME 2.0' }, pointsRequired: '88,000' },
    { brand: { en: 'Snell Golf', zh: 'Snell Golf' }, name: { en: 'PRIME 3.0', zh: 'PRIME 3.0' }, pointsRequired: '112,000' },
    { brand: { en: 'Snell Golf', zh: 'Snell Golf' }, name: { en: 'PRIME 4.0', zh: 'PRIME 4.0' }, pointsRequired: '120,000' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'Women HC RIBBON VISOR', zh: 'Women HC RIBBON VISOR' }, pointsRequired: '138,000' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'Auth-Tech Putter Cover Blade or Mallet', zh: 'Auth-Tech Putter Cover Blade or Mallet' }, pointsRequired: '168,000' },
    { brand: { en: 'PuttOUT Golf', zh: 'PuttOUT Golf' }, name: { en: 'Medium Putting Mat - 240cm x 50cm', zh: 'Medium Putting Mat - 240cm x 50cm' }, pointsRequired: '120,000 + HK$600' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'TP5 Pix3.0 Taco Golf Balls', zh: 'TP5 Pix3.0 Taco Golf Balls' }, pointsRequired: '258,000' },
    { brand: { en: 'Orange Whip Golf', zh: 'Orange Whip Golf' }, name: { en: 'Trainer - 43" Mid-size or 47" Trainer', zh: 'Trainer - 43" Mid-size or 47" Trainer' }, pointsRequired: '100,000 + HK$450' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'Women Metal-T Range Bag', zh: 'Women Metal-T Range Bag' }, pointsRequired: '120,000 + HK$450' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'Slim Stand Carry Case', zh: 'Slim Stand Carry Case' }, pointsRequired: '150,000 + HK$700' },
    { brand: { en: 'GOLFBUDDY', zh: 'GOLFBUDDY' }, name: { en: 'GB LASER Atom Rangefinder', zh: 'GB LASER Atom Rangefinder' }, pointsRequired: '180,000 + HK$1,450' },
    { brand: { en: 'GOLFBUDDY', zh: 'GOLFBUDDY' }, name: { en: 'Aim Quantum Rangefinder', zh: 'Aim Quantum Rangefinder' }, pointsRequired: '180,000 + HK$1,980' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'Milled Grind 4 Black Wedge', zh: 'Milled Grind 4 Black Wedge' }, pointsRequired: '150,000 + HK$650' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'Spider GT Putter', zh: 'Spider GT Putter' }, pointsRequired: '150,000 + HK$1,000' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'Qi10 Rescue', zh: 'Qi10 Rescue' }, pointsRequired: '1,500,000 + HK$1,300' },
    { brand: { en: 'TaylorMade', zh: 'TaylorMade' }, name: { en: 'Qi10 Driver', zh: 'Qi10 Driver' }, pointsRequired: '2,000,000 + HK$2,300' },
  ],
};

router.get('/', async (req: Request, res: Response): Promise<void> => {
  try {
    let doc = await BonusPoints.findOne();

    if (!doc) {
      doc = new BonusPoints(defaultData);
      await doc.save();
    }

    res.json(doc);
  } catch (error) {
    res.status(500).json({ error: 'Server error' });
  }
});

router.put(
  '/',
  authenticate,
  requireRole('admin'),
  async (req: AuthRequest, res: Response): Promise<void> => {
    try {
      let doc = await BonusPoints.findOne();

      if (!doc) {
        doc = new BonusPoints(req.body);
      } else {
        Object.assign(doc, req.body);
      }

      await doc.save();
      res.json(doc);
    } catch (error) {
      res.status(500).json({ error: 'Server error' });
    }
  }
);

export default router;
