import { type ProjectSecurityTable } from './ProjectNeedsSecuring.types'
import { parseDbSchemaString } from '@/data/config/project-postgrest-config-query'

const DEFAULT_EXPOSED_SCHEMA = 'public'

export const getTableKey = ({ schema, name }: { schema: string; name: string }) =>
  `${schema}.${name}`

export const getTablePoliciesHref = (
  projectRef: string | undefined,
  schema: string | undefined,
  name: string | undefined
): string => {
  return `/project/${projectRef ?? ''}/auth/policies?schema=${encodeURIComponent(
    schema ?? ''
  )}&search=${encodeURIComponent(name ?? '')}`
}

export const getExposedSchemas = (dbSchema: string | null | undefined) => {
  const schemas = dbSchema ? parseDbSchemaString(dbSchema) : []
  return schemas.length > 0 ? schemas : [DEFAULT_EXPOSED_SCHEMA]
}

export const formatRlsDescription = (count: number) => {
  const isSingular = count === 1
  const noun = isSingular ? 'table' : 'tables'
  const verb = isSingular ? 'has' : 'have'
  const pronoun = isSingular ? 'its' : 'their'

  return `${count} ${noun} ${verb} RLS disabled which means anyone can access ${pronoun} data via the Data API.`
}

export const buildSecurityPromptMarkdown = (issueCount: number, tables: ProjectSecurityTable[]) => {
  const header = [
    '## Project security review',
    '',
    formatRlsDescription(issueCount),
    '',
    '### Tables',
    '',
    '| Table | Schema | Accessible via Data API | RLS |',
    '| --- | --- | --- | --- |',
  ]

  const rows = tables.map(
    (table) =>
      `| ${table.name} | ${table.schema} | ${table.dataApiAccessible ? 'Yes' : 'No'} | ${table.rlsEnabled ? 'Enabled' : 'Disabled'} |`
  )

  const footer = [
    '',
    '### Next step',
    '',
    'Help me enable RLS on these tables and suggest the minimum policies I should create.',
  ]

  return [...header, ...rows, ...footer].join('\n')
}

export const sortTables = (tables: ProjectSecurityTable[]) => {
  return [...tables].sort((a, b) => {
    const aPriority = a.hasRlsIssue ? 0 : a.rlsEnabled ? 2 : 1
    const bPriority = b.hasRlsIssue ? 0 : b.rlsEnabled ? 2 : 1

    if (aPriority !== bPriority) return aPriority - bPriority

    const schemaComparison = a.schema.localeCompare(b.schema)
    if (schemaComparison !== 0) return schemaComparison

    return a.name.localeCompare(b.name)
  })
}
