import { NextRequest, NextResponse } from 'next/server'
import { getTelegramConfig } from '@/lib/telegram-config'
import { getTelegramWebhookInfo, setTelegramWebhook } from '@/lib/telegram-bot-api'

export const runtime = 'nodejs'
export const dynamic = 'force-dynamic'

function resolveWebhookUrl(request: NextRequest): string | null {
  const fromQuery = request.nextUrl.searchParams.get('url')?.trim()
  if (fromQuery) return fromQuery.replace(/\/$/, '')

  const fromEnv = process.env.NEXT_PUBLIC_APP_URL?.trim()
  if (fromEnv) {
    return `${fromEnv.replace(/\/$/, '')}/api/telegram/webhook`
  }

  const host = request.headers.get('x-forwarded-host') || request.headers.get('host')
  const proto = request.headers.get('x-forwarded-proto') || 'https'
  if (host && !host.includes('localhost')) {
    return `${proto}://${host}/api/telegram/webhook`
  }

  return null
}

async function registerWebhook(request: NextRequest) {
  const config = getTelegramConfig()
  if (!config) {
    return NextResponse.json({ ok: false, error: 'Telegram not configured' }, { status: 503 })
  }

  const webhookUrl = resolveWebhookUrl(request)
  if (!webhookUrl || !webhookUrl.startsWith('https://')) {
    return NextResponse.json(
      {
        ok: false,
        error: 'Need HTTPS webhook URL',
        hint: 'Set NEXT_PUBLIC_APP_URL on Vercel, or open this URL on your live site: /api/telegram/set-webhook?register=1',
        example:
          'https://YOUR-APP.vercel.app/api/telegram/set-webhook?register=1',
      },
      { status: 400 }
    )
  }

  const dropPending =
    request.nextUrl.searchParams.get('drop_pending') === '1' ||
    request.nextUrl.searchParams.get('drop_pending') === 'true'

  const result = await setTelegramWebhook(webhookUrl, { dropPendingUpdates: dropPending })
  const info = await getTelegramWebhookInfo()

  return NextResponse.json({
    ok: result.ok,
    webhookUrl,
    description: result.description,
    webhook: info.result ?? null,
    hint: result.ok
      ? 'Webhook registered. Post /help in your Telegram channel to test.'
      : 'Registration failed — check TELEGRAM_BOT_TOKEN on Vercel.',
  })
}

/** GET — webhook status. GET ?register=1 — register webhook (use on live Vercel URL). POST — same as register. */
export async function GET(request: NextRequest) {
  const shouldRegister =
    request.nextUrl.searchParams.get('register') === '1' ||
    request.nextUrl.searchParams.get('register') === 'true'

  if (shouldRegister) {
    return registerWebhook(request)
  }

  const info = await getTelegramWebhookInfo()
  const webhook = info.result ?? null
  const url = typeof webhook?.url === 'string' ? webhook.url : ''
  const pending = webhook?.pending_update_count ?? 0

  return NextResponse.json({
    ok: info.ok,
    configured: Boolean(getTelegramConfig()),
    webhook,
    description: info.description,
    ...(url
      ? {}
      : {
          problem:
            'Webhook URL is empty — Telegram cannot deliver /help, /sessions, or button clicks.',
          fix: 'Open this on your deployed site (replace domain): /api/telegram/set-webhook?register=1',
          pendingUpdatesNote:
            pending > 0
              ? `${pending} updates are queued and will be delivered after you register.`
              : undefined,
        }),
  })
}

export async function POST(request: NextRequest) {
  return registerWebhook(request)
}
