import type { NextApiRequest, NextApiResponse } from 'next'
import { createConnection } from 'mysql2/promise'
import {
  paymentReminderSmsText,
  smsAppUrl,
  verifySmsReminder,
} from '@/lib/smsReminder'

async function createDatabaseConnection() {
  return createConnection({
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
  })
}

function htmlPage(title: string, body: string, extraHead = '') {
  return `<!DOCTYPE html>
<html lang="cs">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <title>${title}</title>
  <style>
    body { margin:0; min-height:100vh; display:flex; align-items:center; justify-content:center; background:#0d1b2a; color:#e0e1dd; font-family:system-ui,sans-serif; padding:24px; }
    .box { max-width:420px; text-align:center; }
    a { display:inline-block; margin-top:18px; padding:14px 22px; border-radius:12px; background:#415a77; color:#fff; font-weight:700; text-decoration:none; }
    p { line-height:1.5; color:#bdc8d4; }
  </style>
  ${extraHead}
</head>
<body>
  <div class="box">${body}</div>
</body>
</html>`
}

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
  if (req.method !== 'GET') {
    res.setHeader('Allow', 'GET')
    return res.status(405).send(htmlPage('SMS', '<p>Metoda není povolena.</p>'))
  }

  const orderId = Number(req.query.o)
  const token = String(req.query.s || '')
  if (!Number.isInteger(orderId) || orderId <= 0 || !verifySmsReminder(orderId, token)) {
    return res.status(403).send(htmlPage('SMS', '<p>Odkaz na SMS je neplatný.</p>'))
  }

  const connection = await createDatabaseConnection()
  try {
    const [rows] = await connection.execute(
      `SELECT o.id, o.order_number, oa.phone, p.trans_id, p.status AS payment_status
       FROM orders o
       LEFT JOIN order_addresses oa ON oa.id = (
         SELECT a.id FROM order_addresses a
         WHERE a.order_id = o.id
         ORDER BY CASE WHEN a.address_type = 'billing' THEN 0 ELSE 1 END, a.id
         LIMIT 1
       )
       LEFT JOIN payments p ON p.id = (
         SELECT p2.id FROM payments p2 WHERE p2.order_id = o.id ORDER BY p2.created_at DESC, p2.id DESC LIMIT 1
       )
       WHERE o.id = ?
       LIMIT 1`,
      [orderId]
    )
    const order = (rows as Array<{
      id: number
      order_number: string
      phone: string | null
      trans_id: string | null
      payment_status: string | null
    }>)[0]

    if (!order) {
      return res.status(404).send(htmlPage('SMS', '<p>Objednávka se nenašla.</p>'))
    }
    if ((order.payment_status || '').toUpperCase() !== 'PENDING') {
      return res.status(409).send(htmlPage('SMS', '<p>SMS jde jen u čekající platby.</p>'))
    }
    if (!order.phone || !order.trans_id) {
      return res.status(409).send(htmlPage('SMS', '<p>U objednávky chybí telefon nebo platební odkaz.</p>'))
    }

    await connection.execute(
      `INSERT INTO order_sms_reminders (order_id, sent_at, sent_by)
       VALUES (?, NOW(), NULL)
       ON DUPLICATE KEY UPDATE sent_at = NOW()`,
      [order.id]
    )

    const message = paymentReminderSmsText({
      order_number: order.order_number,
      trans_id: order.trans_id,
    })
    const smsUrl = smsAppUrl(order.phone, message)
    const href = smsUrl.replace(/&/g, '&amp;')

    res.setHeader('Content-Type', 'text/html; charset=utf-8')
    res.setHeader('Cache-Control', 'no-store')
    return res.status(200).send(htmlPage(
      'Odeslat SMS',
      `<p>Otevírám aplikaci Zprávy…</p>
       <a href="${href}">Otevřít Zprávy</a>
       <script>location.replace(${JSON.stringify(smsUrl)})</script>`,
      `<meta http-equiv="refresh" content="0;url=${href}">`
    ))
  } catch (error) {
    console.error('[sms-reminder]', error)
    return res.status(500).send(htmlPage('SMS', '<p>SMS se nepodařilo připravit.</p>'))
  } finally {
    await connection.end().catch(() => undefined)
  }
}
