import { newError } from '@/errors/base'
import { ErrorCode } from '@/errors/codes'
import { Flags } from '@/framework/flags'

export const HTTP_RETRY_DEFAULT = 3

export const httpRetryFlag = Flags.integer({
  description: 'HTTP retry attempts for GET/PUT/DELETE on transient errors. 0 disables. Overrides DIFYCTL_HTTP_RETRY.',
  helpGroup: 'GLOBAL',
})

export type ResolveRetryAttemptsOpts = {
  flag: number | undefined
  env: (k: string) => string | undefined
}

export function resolveRetryAttempts(opts: ResolveRetryAttemptsOpts): number {
  if (opts.flag !== undefined)
    return opts.flag
  const raw = opts.env('DIFYCTL_HTTP_RETRY')
  if (raw === undefined || raw === '')
    return HTTP_RETRY_DEFAULT
  if (!/^-?\d+$/.test(raw))
    throw newError(ErrorCode.UsageInvalidFlag, `DIFYCTL_HTTP_RETRY: ${JSON.stringify(raw)} is not a non-negative integer`)
  const n = Number(raw)
  if (n < 0)
    throw newError(ErrorCode.UsageInvalidFlag, `DIFYCTL_HTTP_RETRY: ${n} is negative`)
  return n
}
