import { NextRequest, NextResponse } from 'next/server'
import { invitationRepo } from '@/lib/database/repositories/invitation.repo'
import { startLoginQr } from '@/lib/im/adapters/weixin/weixin-api'
import { normalizeQrCodeUrl } from '@/lib/qrcode'

/**
 * POST /api/invite/[token]/start-qr
 * Start the WeChat iLink QR login flow for this invitation.
 * Public endpoint — the invite token is the auth.
 *
 * Returns QR code image URL for the invitee to scan with WeChat.
 */
export async function POST(
  req: NextRequest,
  { params }: { params: Promise<{ token: string }> },
) {
  const { token } = await params

  // Validate invitation
  const invite = invitationRepo.findByInviteToken(token)

  if (!invite) {
    return NextResponse.json({ error: 'Invitation not found' }, { status: 404 })
  }

  // Must be phone_verified to proceed
  if (invite.status !== 'phone_verified') {
    return NextResponse.json({
      error: `Cannot generate QR code in status: ${invite.status}. Phone verification required first.`
    }, { status: 400 })
  }

  // Check expiry
  const now = Math.floor(Date.now() / 1000)
  if (now > invite.expiresAt) {
    invitationRepo.markExpired(invite.id)
    return NextResponse.json({ error: 'Invitation has expired' }, { status: 410 })
  }

  try {
    // Call iLink API to start QR login
    const qrResponse = await startLoginQr()

    if (qrResponse.errcode && qrResponse.errcode !== 0) {
      return NextResponse.json({
        error: qrResponse.errmsg || 'Failed to generate QR code'
      }, { status: 502 })
    }

    if (!qrResponse.qrcode || !qrResponse.qrcode_img_content) {
      return NextResponse.json({ error: 'No QR code returned from iLink' }, { status: 502 })
    }

    // Normalize QR code URL (might be base64 or URL)
    const rawQr = qrResponse.qrcode_img_content
    console.log('[invite] raw qrcode_img_content:', rawQr.slice(0, 200))
    const qrcodeUrl = normalizeQrCodeUrl(rawQr)
    console.log('[invite] normalized qrcode_url:', qrcodeUrl.slice(0, 200))

    // Update invitation
    invitationRepo.markQrGenerated(invite.id, qrResponse.qrcode, qrcodeUrl)

    return NextResponse.json({
      success: true,
      qrcodeKey: qrResponse.qrcode,
      qrcodeContent: qrcodeUrl,  // text/URL to encode into QR image
    })
  } catch (err) {
    const message = err instanceof Error ? err.message : 'Unknown error'
    console.error('[invite] start-qr error:', message)
    return NextResponse.json({ error: message }, { status: 502 })
  }
}
