import { NextRequest, NextResponse } from 'next/server'
import { getUserSession } from '@/lib/auth/permissions'
import { createAdminClient } from '@/lib/supabase/admin'
import { generateAllHolidays } from '@/lib/holidays/seed-holidays'

export async function POST(req: NextRequest) {
  const session = await getUserSession()
  if (!session || (session.role !== 'admin' && session.role !== 'masteradmin')) {
    return NextResponse.json({ error: 'Forbidden' }, { status: 403 })
  }

  const admin = createAdminClient()

  // Seed holiday_calendars first
  const { error: calError } = await admin.from('holiday_calendars').upsert([
    { code: 'bavaria',  label: 'Bayerische Feiertage',    country_or_region: 'DE-BY', is_default_for_new_users: true,  is_active: true },
    { code: 'germany',  label: 'Deutsche Feiertage',      country_or_region: 'DE',    is_default_for_new_users: false, is_active: true },
    { code: 'usa',      label: 'Amerikanische Feiertage', country_or_region: 'US',    is_default_for_new_users: false, is_active: true },
    { code: 'china',    label: 'Chinesische Feiertage',   country_or_region: 'CN',    is_default_for_new_users: false, is_active: true },
    { code: 'england',  label: 'England Feiertage',       country_or_region: 'GB-ENG',is_default_for_new_users: false, is_active: true },
  ], { onConflict: 'code' })

  if (calError) {
    return NextResponse.json({ error: `Calendar upsert failed: ${calError.message}` }, { status: 500 })
  }

  // Fetch calendar IDs
  const { data: calendars } = await admin
    .from('holiday_calendars')
    .select('id, code')

  const calMap = new Map<string, string>((calendars ?? []).map(c => [c.code as string, c.id as string]))

  const allEntries = generateAllHolidays()

  const rows = allEntries
    .map(e => {
      const calId = calMap.get(e.calendar_code)
      if (!calId) return null
      return {
        holiday_calendar_id: calId,
        name:       e.name,
        start_date: e.start_date,
        end_date:   e.end_date,
        is_active:  true,
      }
    })
    .filter((r): r is NonNullable<typeof r> => r !== null)

  // Insert in batches of 200
  let inserted = 0
  for (let i = 0; i < rows.length; i += 200) {
    const batch = rows.slice(i, i + 200)
    const { error } = await admin
      .from('holiday_entries')
      .upsert(batch, { onConflict: 'holiday_calendar_id,name,start_date' })
    if (error) {
      return NextResponse.json({ error: `Batch insert failed: ${error.message}` }, { status: 500 })
    }
    inserted += batch.length
  }

  return NextResponse.json({ success: true, inserted, total: rows.length })
}
