import { createClient } from '@/lib/supabase/server'

export interface ViewConfig {
  module: string
  filters: {
    projectTypes?: string[]        // allowed project type codes (empty = all)
    statuses?: string[]            // allowed status codes (empty = all)
    onlyOwn?: boolean              // only projects where auth user is assigned
    onlyDepartment?: boolean       // only projects of user's department
    onlyActive?: boolean           // exclude status_20 (cancelled) and status_100 (completed)
  }
  columns?: string[]               // which columns to show (empty = all)
  defaultSort?: { field: string; direction: 'asc' | 'desc' }
}

// Default configs per role code
const DEFAULT_CONFIGS: Record<string, ViewConfig> = {
  masteradmin: { module: '', filters: {} },
  admin:       { module: '', filters: {} },
  consultant:  { module: '', filters: { onlyOwn: true, onlyActive: true } },
  readonly:    { module: '', filters: { onlyActive: true } },
}

export async function getViewConfigForRole(roleId: string, module: string): Promise<ViewConfig> {
  const supabase = await createClient()
  const { data } = await supabase
    .from('role_view_configs')
    .select('config')
    .eq('role_id', roleId)
    .eq('module', module)
    .maybeSingle()

  if (data?.config) return data.config as ViewConfig

  // Look up role code for default
  const { data: role } = await supabase.from('roles').select('code').eq('id', roleId).maybeSingle()
  const code = (role?.code as string) ?? 'readonly'
  return { ...(DEFAULT_CONFIGS[code] ?? DEFAULT_CONFIGS.readonly), module }
}

export async function saveViewConfig(roleId: string, module: string, config: ViewConfig): Promise<void> {
  const supabase = await createClient()
  await supabase
    .from('role_view_configs')
    .upsert({ role_id: roleId, module, config }, { onConflict: 'role_id,module' })
}
