import type { InvoiceError } from '../errors.js'

export interface MorningCredentials {
  apiUser: string
  apiPass: string
}

export interface MorningClientOptions {
  baseUrl?: string
  tokenPath?: string
  documentPath?: string
  fetch?: typeof fetch
}

export interface MorningTokenResponse {
  access_token?: unknown
  accessToken?: unknown
  token?: unknown
  data?: {
    access_token?: unknown
    accessToken?: unknown
    token?: unknown
  }
}

export interface MorningDocumentResponse {
  id?: unknown
  number?: unknown
  docNum?: unknown
  url?: unknown
  doc_id?: unknown
  doc_number?: unknown
  documentId?: unknown
  documentNumber?: unknown
  documentUrl?: unknown
}

export function invalidMorningCredentialsError(): InvoiceError {
  return {
    code: 'CREDENTIAL_INVALID',
    issued: 'no',
    message: 'Morning credentials must include non-empty apiUser and apiPass',
  }
}

export function isMorningCredentials(value: unknown): value is MorningCredentials {
  if (typeof value !== 'object' || value === null) return false

  const candidate = value as Record<string, unknown>
  return (
    isNonEmptyString(candidate.apiUser) &&
    isNonEmptyString(candidate.apiPass)
  )
}

export function validateMorningCredentials(
  value: unknown,
): { ok: true; credentials: MorningCredentials } | { ok: false; error: InvoiceError } {
  if (!isMorningCredentials(value)) {
    return { ok: false, error: invalidMorningCredentialsError() }
  }

  return { ok: true, credentials: value }
}

function isNonEmptyString(value: unknown): value is string {
  return typeof value === 'string' && value.trim().length > 0
}
