import { NextRequest, NextResponse } from 'next/server'
import {
  defaultOfflineUntilIso,
  readSiteStatus,
  writeSiteStatus,
  type SiteStatus,
} from '@/lib/site-status'
import { OFFLINE_COOKIE } from '@/lib/portal-access'

function applyOfflineCookie(res: NextResponse, status: SiteStatus) {
  if (status.offline) {
    res.cookies.set(OFFLINE_COOKIE, '1', {
      path: '/',
      sameSite: 'lax',
      httpOnly: false,
      maxAge: 60 * 60 * 24,
    })
  } else {
    res.cookies.set(OFFLINE_COOKIE, '', {
      path: '/',
      sameSite: 'lax',
      httpOnly: false,
      maxAge: 0,
    })
  }
  res.headers.set('Cache-Control', 'no-store')
  return res
}

export async function GET() {
  const status = await readSiteStatus()
  return applyOfflineCookie(NextResponse.json(status), status)
}

export async function POST(request: NextRequest) {
  try {
    const body = await request.json()
    const offline = Boolean(body.offline)

    let offlineUntil: string | null =
      typeof body.offlineUntil === 'string' && body.offlineUntil
        ? new Date(body.offlineUntil).toISOString()
        : null

    if (offline && !offlineUntil) {
      offlineUntil = defaultOfflineUntilIso()
    }
    if (!offline) {
      offlineUntil = null
    }

    const offlineMessage =
      typeof body.offlineMessage === 'string' ? body.offlineMessage : null

    const status = await writeSiteStatus({
      offline,
      offlineUntil,
      offlineMessage,
    })

    return applyOfflineCookie(
      NextResponse.json({ success: true, status }),
      status
    )
  } catch (error) {
    console.error('[site-status] POST error:', error)
    return NextResponse.json({ success: false, error: 'Failed to update' }, { status: 500 })
  }
}
