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

const GLG_EMAIL = 'golfid@glg.com.hk';

function createMailTransport() {
  const host = process.env.SMTP_HOST;
  const port = parseInt(process.env.SMTP_PORT || '587', 10);
  const user = process.env.SMTP_USER;
  const pass = process.env.SMTP_PASS;

  if (!host || !user || !pass) return null;

  return nodemailer.createTransport({
    host,
    port,
    secure: port === 465,
    auth: { user, pass },
  });
}

const router = Router();

const defaultData = {
  heroTitle: { en: 'Contact GLG', zh: '聯絡GLG' },
  heroSubtitle: {
    en: 'Please contact us through the following channels',
    zh: '請透過以下渠道與我們聯絡',
  },
  contactItems: [
    {
      label: { en: 'Address', zh: '地址' },
      value: {
        en: 'Room A, 18/F., Genesis, 33-35 Wong Chuk Hang Road, Hong Kong',
        zh: '香港黃竹坑道33-35號創協坊18樓A室',
      },
    },
    {
      label: { en: 'Telephone', zh: '電話' },
      value: { en: '(852) 3582-3088', zh: '(852) 3582-3088' },
      href: 'tel:+85235823088',
    },
    {
      label: { en: 'WhatsApp', zh: 'WhatsApp' },
      value: { en: '(852) 6589-8235', zh: '(852) 6589-8235' },
      href: 'https://wa.me/85265898235',
    },
    {
      label: { en: 'Email', zh: '電郵' },
      value: { en: 'golfid@glg.com.hk', zh: 'golfid@glg.com.hk' },
      href: 'mailto:golfid@glg.com.hk',
    },
    {
      label: { en: 'Business Hours', zh: '辦公時間' },
      value: {
        en: 'Monday to Friday: 9:00am – 6:00pm\nSaturdays, Sundays and Public Holidays: Closed',
        zh: '星期一至五：上午9:00 – 下午6:00\n星期六、日及公眾假期：休息',
      },
    },
  ],
  formTitle: {
    en: "Leave us a message and we'll get back to you.",
    zh: '留下訊息，我們會盡快回覆您。',
  },
  formSubtitle: {
    en: 'Have any feedback about our service? We would love to hear from you.',
    zh: '對我們的服務有任何意見？我們非常樂意聽取您的反饋。',
  },
};

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

    if (!doc) {
      doc = new ContactPage(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 ContactPage.findOne();

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

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

router.post('/inquiries', async (req: Request, res: Response): Promise<void> => {
  try {
    const { name, phone, email, message } = req.body;

    if (!name || !email || !message) {
      res.status(400).json({ error: 'Name, email, and message are required' });
      return;
    }

    const inquiry = new ContactInquiry({ name, phone, email, message });
    await inquiry.save();

    res.status(201).json(inquiry);

    const transport = createMailTransport();
    if (transport) {
      transport
        .sendMail({
          from: `"GLG Website" <${process.env.SMTP_USER}>`,
          to: GLG_EMAIL,
          replyTo: email,
          subject: `New Contact Inquiry from ${name}`,
          text: [
            `Name: ${name}`,
            phone ? `Phone: ${phone}` : null,
            `Email: ${email}`,
            '',
            message,
          ]
            .filter((l) => l !== null)
            .join('\n'),
          html: `
            <h2>New Contact Inquiry</h2>
            <p><strong>Name:</strong> ${name}</p>
            ${phone ? `<p><strong>Phone:</strong> ${phone}</p>` : ''}
            <p><strong>Email:</strong> ${email}</p>
            <hr />
            <p>${message.replace(/\n/g, '<br />')}</p>
          `,
        })
        .catch((err: unknown) => {
          console.error('Failed to send contact email:', err);
        });
    }
  } catch (error) {
    res.status(500).json({ error: 'Server error' });
  }
});

router.get(
  '/inquiries',
  authenticate,
  requireRole('admin'),
  async (req: AuthRequest, res: Response): Promise<void> => {
    try {
      const page = parseInt(req.query.page as string) || 1;
      const limit = parseInt(req.query.limit as string) || 20;
      const skip = (page - 1) * limit;

      const [inquiries, total] = await Promise.all([
        ContactInquiry.find().sort({ createdAt: -1 }).skip(skip).limit(limit),
        ContactInquiry.countDocuments(),
      ]);

      res.json({
        inquiries,
        pagination: {
          page,
          limit,
          total,
          pages: Math.ceil(total / limit),
        },
      });
    } catch (error) {
      res.status(500).json({ error: 'Server error' });
    }
  }
);

export default router;
