import { getTableColumns, getTableName } from 'drizzle-orm'
import { getTableConfig } from 'drizzle-orm/pg-core'
import { describe, expect, it } from 'vitest'
import { i18nContentSchema, languages, translationValue } from './schema.js'

describe('i18n-content schema', () => {
  it('translationValue table name is translation_value', () => {
    expect(getTableName(translationValue)).toBe('translation_value')
  })

  it('languages table name is languages', () => {
    expect(getTableName(languages)).toBe('languages')
  })

  it('translationValue has expected columns', () => {
    expect(Object.keys(getTableColumns(translationValue))).toEqual([
      'id',
      'entityType',
      'entityId',
      'fieldKey',
      'locale',
      'value',
      'sourceHash',
      'manualOverride',
      'modelId',
      'status',
      'translatedAt',
      'createdAt',
      'updatedAt',
    ])
  })

  it('translationValue.locale has FK to languages.code', () => {
    const { foreignKeys } = getTableConfig(translationValue)
    const localeFk = foreignKeys.find((fk) =>
      fk.reference().columns.some((col) => col.name === 'locale'),
    )
    expect(localeFk).toBeDefined()
    expect(localeFk!.reference().foreignTable).toBe(languages)
    expect(localeFk!.reference().foreignColumns.map((col) => col.name)).toEqual(['code'])
  })

  it('languages has expected columns', () => {
    expect(Object.keys(getTableColumns(languages))).toEqual([
      'code',
      'nameNative',
      'nameEnglish',
      'direction',
      'searchConfig',
      'isActive',
      'isDefault',
      'sortOrder',
      'createdAt',
      'updatedAt',
    ])
  })

  it('translationValue has expected indexes', () => {
    const { indexes } = getTableConfig(translationValue)
    expect(indexes.map((idx) => idx.config.name)).toEqual([
      'tv_entity_field_locale_uq',
      'tv_entity_locale_idx',
      'tv_locale_status_idx',
      'tv_entity_field_locale_val_idx',
    ])
  })

  it('languages has expected indexes', () => {
    const { indexes } = getTableConfig(languages)
    expect(indexes.map((idx) => idx.config.name)).toEqual([
      'languages_one_default_uq',
      'languages_active_sort_idx',
    ])
  })

  it('languages_one_default_uq is a partial unique index', () => {
    const { indexes } = getTableConfig(languages)
    const defaultIdx = indexes.find((idx) => idx.config.name === 'languages_one_default_uq')
    expect(defaultIdx?.config.unique).toBe(true)
    expect(defaultIdx?.config.where).toBeDefined()
  })

  it('tv_entity_field_locale_val_idx has partial WHERE clause', () => {
    const { indexes } = getTableConfig(translationValue)
    const valIdx = indexes.find((idx) => idx.config.name === 'tv_entity_field_locale_val_idx')
    expect(valIdx).toBeDefined()
    expect(valIdx?.config.where).toBeDefined()
  })

  it('exports i18nContentSchema bundle', () => {
    expect(i18nContentSchema.translationValue).toBe(translationValue)
    expect(i18nContentSchema.languages).toBe(languages)
  })
})
