'use server'

import { revalidatePath } from 'next/cache'
import { redirect } from 'next/navigation'
import { createClient } from '@/lib/supabase/server'
import { getAppOrg } from '@/lib/org'
import { getEffectiveUser } from '@/lib/effective-user'

function fail(msg: string): never {
  redirect(`/?error=${encodeURIComponent(msg)}`)
}

export async function postComment(formData: FormData) {
  const body = String(formData.get('body') ?? '').trim()
  if (!body) fail('Comment body is required.')

  const supabase = await createClient()
  const org = await getAppOrg(supabase)
  if (!org) fail('Organization not found.')

  const eu = await getEffectiveUser(supabase, org.id)
  if (!eu) fail('Not authenticated.')

  const { error } = await supabase.from('comments').insert({
    org_id: org.id,
    author_id: eu.effective_user_id,
    body,
  })
  if (error) fail(error.message)

  revalidatePath('/', 'layout')
  redirect('/?comments=1')
}

export async function resolveComment(formData: FormData) {
  const id = String(formData.get('id') ?? '')
  if (!id) fail('Missing comment id.')

  const supabase = await createClient()
  const org = await getAppOrg(supabase)
  if (!org) fail('Organization not found.')

  const eu = await getEffectiveUser(supabase, org.id)
  if (!eu) fail('Not authenticated.')

  const { error } = await supabase
    .from('comments')
    .update({
      resolved_at: new Date().toISOString(),
      resolved_by: eu.effective_user_id,
    })
    .eq('org_id', org.id)
    .eq('id', id)
  if (error) fail(error.message)

  revalidatePath('/', 'layout')
  redirect('/?comments=1')
}

export async function reopenComment(formData: FormData) {
  const id = String(formData.get('id') ?? '')
  if (!id) fail('Missing comment id.')

  const supabase = await createClient()
  const org = await getAppOrg(supabase)
  if (!org) fail('Organization not found.')

  const { error } = await supabase
    .from('comments')
    .update({ resolved_at: null, resolved_by: null })
    .eq('org_id', org.id)
    .eq('id', id)
  if (error) fail(error.message)

  revalidatePath('/', 'layout')
  redirect('/?comments=1')
}

export async function deleteComment(formData: FormData) {
  const id = String(formData.get('id') ?? '')
  if (!id) fail('Missing comment id.')

  const supabase = await createClient()
  const org = await getAppOrg(supabase)
  if (!org) fail('Organization not found.')

  const { error } = await supabase
    .from('comments')
    .delete()
    .eq('org_id', org.id)
    .eq('id', id)
  if (error) fail(error.message)

  revalidatePath('/', 'layout')
  redirect('/?comments=1')
}
