import type { APIRoute } from 'astro'
import { getDb } from '../../../lib/db'
import {
  validateBearer, unauthorizedResponse, badRequestResponse,
  jsonResponse, notFoundResponse, hasForbiddenFields,
} from '../../../lib/auth'
import { purgeCloudflareCache } from '../../../lib/cloudflare'

export const GET: APIRoute = ({ params }) => {
  const db = getDb()
  const casino = db.prepare('SELECT * FROM casinos WHERE slug = ?').get(params.slug)
  if (!casino) return notFoundResponse()
  return jsonResponse(casino)
}

export const PUT: APIRoute = async ({ params, request }) => {
  if (!validateBearer(request)) return unauthorizedResponse()

  let body: Record<string, unknown>
  try { body = await request.json() } catch { return badRequestResponse('Invalid JSON') }

  if (hasForbiddenFields(body)) {
    return badRequestResponse('Promo codes are not allowed on this platform')
  }

  const db = getDb()
  const existing = db.prepare('SELECT * FROM casinos WHERE slug = ?').get(params.slug)
  if (!existing) return notFoundResponse()

  const allowed = [
    'brand', 'rating', 'founded', 'license', 'min_deposit', 'bonus_amount',
    'bonus_wagering', 'payout_speed', 'payment_methods', 'categories',
    'pay_n_play', 'featured', 'featured_order', 'affiliate_url',
    'content_sv', 'meta_title', 'meta_desc', 'active',
  ]

  const updates: string[] = []
  const values: unknown[] = []

  for (const key of allowed) {
    if (key in body) {
      const val = body[key]
      updates.push(`${key} = ?`)
      if ((key === 'payment_methods' || key === 'categories') && typeof val === 'object' && val !== null) {
        values.push(JSON.stringify(val))
      } else {
        values.push(val)
      }
    }
  }

  if (updates.length === 0) return badRequestResponse('No valid fields to update')

  updates.push('last_updated = datetime(\'now\')')
  values.push(params.slug)

  db.prepare(`UPDATE casinos SET ${updates.join(', ')} WHERE slug = ?`).run(...values)

  // Purge Cloudflare cache for this page
  await purgeCloudflareCache([
    `https://casinoguidese.com/kasino/${params.slug}/`,
    `https://casinoguidese.com/kasino/`,
    `https://casinoguidese.com/`,
  ])

  return jsonResponse({ success: true })
}

export const DELETE: APIRoute = async ({ params, request }) => {
  if (!validateBearer(request)) return unauthorizedResponse()

  const db = getDb()
  const existing = db.prepare('SELECT id FROM casinos WHERE slug = ?').get(params.slug)
  if (!existing) return notFoundResponse()

  db.prepare("UPDATE casinos SET active = 0, last_updated = datetime('now') WHERE slug = ?").run(params.slug)

  await purgeCloudflareCache([
    `https://casinoguidese.com/kasino/${params.slug}/`,
    `https://casinoguidese.com/kasino/`,
  ])

  return jsonResponse({ success: true, message: 'Casino deactivated (not deleted)' })
}
