import { BinaryContract, PseudoNumericContract } from './contract'
import { formatLargeNumber, formatPercent } from './util/format'

export function formatNumericProbability(
  p: number,
  contract: PseudoNumericContract
) {
  const value = getMappedValue(contract)(p)
  return formatLargeNumber(value)
}

export const getMappedValue =
  (contract: PseudoNumericContract | BinaryContract) => (p: number) => {
    if (contract.outcomeType === 'BINARY') return p

    const { min, max, isLogScale } = contract

    if (isLogScale) {
      const logValue = p * Math.log10(max - min + 1)
      return 10 ** logValue + min - 1
    }

    return p * (max - min) + min
  }

export const getFormattedMappedValue =
  (contract: PseudoNumericContract | BinaryContract) => (p: number) => {
    if (contract.outcomeType === 'BINARY') return formatPercent(p)

    const value = getMappedValue(contract)(p)
    return formatLargeNumber(value)
  }

export const getPseudoProbability = (
  value: number,
  min: number,
  max: number,
  isLogScale = false
) => {
  if (value < min) return 0
  if (value > max) return 1

  if (isLogScale) {
    return Math.log10(value - min + 1) / Math.log10(max - min + 1)
  }

  return (value - min) / (max - min)
}