import { and, eq } from 'drizzle-orm'
import type { Querier } from '@platform-modules/db'

import { credentials, pressZoneSchema } from '../schema.js'

export type Credential = typeof credentials.$inferSelect

export type ResolveCredentialParams = {
  account: string
  site: string
  provider: string
}

type PressZoneDb = Querier<typeof pressZoneSchema>

export class CredentialNotFoundError extends Error {
  override readonly name = 'CredentialNotFoundError'
  readonly code = 'CREDENTIAL_NOT_FOUND' as const
  readonly httpStatus = 404 as const

  constructor(readonly context: ResolveCredentialParams) {
    super(`credential not found: ${context.account}/${context.site}/${context.provider}`)
  }
}

export async function resolveCredential(
  db: PressZoneDb,
  { account, site, provider }: ResolveCredentialParams,
): Promise<Credential> {
  const [credential] = await db
    .select()
    .from(credentials)
    .where(
      and(
        eq(credentials.accountId, account),
        eq(credentials.siteId, site),
        eq(credentials.provider, provider),
      ),
    )
    .limit(1)

  if (!credential) {
    throw new CredentialNotFoundError({ account, site, provider })
  }

  return credential
}
