{"version":3,"file":"chunk-lc7t4qsv.js","sources":["packages/sports/libs/odds/feature/src/odds/odds-formatter.service.ts"],"sourcesContent":["import { Injectable, inject } from '@angular/core';\n\nimport { BetslipConfig } from '@frontend/sports/common/client-config-data-access';\nimport { roundAmericanOdds } from '@frontend/sports/odds/feature/converters';\nimport { OddsDisplayFormat } from '@frontend/sports/types/models/user-settings';\nimport { Decimal } from 'decimal.js';\nimport { min } from 'lodash-es';\n\nimport { Fraction } from './fraction';\nimport { CalculatedOdds, Odds } from './odds';\nimport { OddsConverter } from './odds-converter';\nimport { OddsOperations } from './operations';\n\nconst DECIMAL_PLACES = 2;\nconst SUMMARY_VALUE_THRESHOLD = 1.01;\ntype PartialOdds = Partial | Partial;\nexport interface OddsFormatInput {\n displayFormat: OddsDisplayFormat;\n cutZero?: boolean;\n isSummary?: boolean;\n fromFormat?: OddsDisplayFormat;\n maxDecimalPlaces?: number;\n useOddsMultiplicationFormat?: boolean;\n roundPriceValues?: boolean;\n}\n\nexport const defaultOddsFormatInput = Object.freeze({\n cutZero: false,\n isSummary: false,\n maxDecimalPlaces: 3,\n useOddsMultiplicationFormat: false,\n});\n\n/**\n * Returns a default string representation for invalid odds based on the display format.\n * @param displayFormat - The format type for displaying odds.\n * @returns A string representing invalid odds for the specified format.\n */\nexport const formatInvalidOdds = (displayFormat: OddsDisplayFormat): string => {\n switch (displayFormat) {\n case OddsDisplayFormat.US:\n return '---';\n case OddsDisplayFormat.UK:\n return '-/-';\n default:\n return '-.--';\n }\n};\n\n/**\n * Checks if the given odds object is valid for a specific display format.\n * @param format - The odds display format (EU, UK, or US).\n * @param odds - The odds object containing potential decimal, fractional, or moneyline values.\n * @returns - True if the odds object is valid for the specified format, false otherwise.\n */\n//TODO below type guard should be improved, we need to have a type for valid format odds (something like ValidOdds to replace Odds | CalculatedOdds), because technically below function just ensures that the type is valid, which is true since we only care about selected format availability\nexport const isFormatValid = (format: OddsDisplayFormat, odds: PartialOdds): odds is Odds | CalculatedOdds => {\n switch (format) {\n case OddsDisplayFormat.EU:\n return odds.decimals ? OddsOperations.isDecimalOddsValid(odds.decimals) : false;\n case OddsDisplayFormat.UK:\n return odds.fractional ? OddsOperations.isFractionalOddsValid(odds.fractional) : false;\n case OddsDisplayFormat.US:\n return odds.moneyline ? OddsOperations.isMoneyLineOddsValid(odds.moneyline) : false;\n }\n};\n\n/**\n * Converts a fractional odds representation to the UK odds format with denominator of 1 (e.g., \"3/1\").\n * @param fractional - The fractional odds data.\n * @param maxDecimalPlaces - Maximum number of decimal places to use in formatting.\n * @param isSummary - Indicates if the summary format should be used.\n * @returns - The UK-formatted fractional odds with denominator of 1 as a string.\n */\nexport const toSimplifiedUKOdds = (\n fractional: { numerator: number; denominator: number } | Fraction,\n maxDecimalPlaces: number,\n isSummary: boolean,\n) => {\n const priceValue = new Decimal(fractional.numerator).dividedBy(new Decimal(fractional.denominator));\n const decimalOdds = OddsConverter.fractionToDecimal(Fraction.create(fractional));\n\n const numerator = priceValue.toFixed(\n priceValue.decimalPlaces() > DECIMAL_PLACES && (!isSummary || decimalOdds.lessThan(SUMMARY_VALUE_THRESHOLD))\n ? maxDecimalPlaces\n : min([priceValue.decimalPlaces(), DECIMAL_PLACES]) || 0,\n Decimal.ROUND_DOWN,\n );\n\n return `${numerator}/1`;\n};\n\n/**\n * Formats odds based on the specified display format.\n * @param format - The odds display format (EU, UK, or US).\n * @param odds - The odds object containing decimal, fractional, or moneyline values.\n * @param input - Input parameters for formatting options.\n * @returns - Formatted odds string based on the specified format.\n */\nexport const formatOddsInternal = (format: OddsDisplayFormat, odds: PartialOdds, input: Required) => {\n switch (format) {\n case OddsDisplayFormat.EU:\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return formatDecimals(odds.decimals!, input.cutZero, input.isSummary, input.maxDecimalPlaces);\n case OddsDisplayFormat.UK:\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return formatFractional(odds.fractional!, input.isSummary, input.maxDecimalPlaces, input.useOddsMultiplicationFormat);\n case OddsDisplayFormat.US:\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return formatMoneyLine(odds.moneyline!, input.roundPriceValues);\n }\n};\n\n/**\n * Formats moneyline odds as a string, with an option for rounding values.\n * @param moneyline - The moneyline odds value.\n * @param roundPriceValues - If true, round moneyline odds according to configuration.\n * @returns - Formatted moneyline odds string.\n */\nexport const formatMoneyLine = (moneyline: number | Decimal, roundPriceValues: boolean) => {\n if (typeof moneyline === 'number') {\n moneyline = new Decimal(moneyline);\n }\n\n const moneyLineString = roundAmericanOdds(moneyline, roundPriceValues);\n\n return moneyline.greaterThan(0) ? `+${moneyLineString}` : `${moneyLineString}`;\n};\n\n/**\n * Formats decimal odds to a string, applying specified formatting rules.\n * @param decimals - The decimal odds value.\n * @param cutZero - If true, removes trailing zeros from the decimal value.\n * @param isSummary - Indicates if the summary format should be used.\n * @param maxDecimalPlaces - Maximum number of decimal places to display.\n * @returns - Formatted decimal odds string.\n */\nexport const formatDecimals = (decimals: number | Decimal, cutZero: boolean, isSummary: boolean, maxDecimalPlaces: number) => {\n if (typeof decimals === 'number') {\n if (decimals > 1 && decimals < 1.01) {\n return decimals.toFixed(3);\n }\n decimals = new Decimal(decimals);\n }\n\n if (cutZero && decimals.decimalPlaces() > DECIMAL_PLACES) {\n const result = decimals.toFixed(decimals.decimalPlaces() > DECIMAL_PLACES ? maxDecimalPlaces : DECIMAL_PLACES, Decimal.ROUND_DOWN);\n\n return result.endsWith('0') ? decimals.toFixed(DECIMAL_PLACES, Decimal.ROUND_DOWN) : result;\n }\n\n return decimals.toFixed(\n decimals.decimalPlaces() > DECIMAL_PLACES && (!isSummary || decimals.lessThan(SUMMARY_VALUE_THRESHOLD)) ? maxDecimalPlaces : DECIMAL_PLACES,\n Decimal.ROUND_DOWN,\n );\n};\n\n/**\n * Formats fractional odds to a string based on summary or multiplication format options.\n * @param - The fractional odds data.\n * @param isSummary - Indicates if the summary format should be used.\n * @param maxDecimalPlaces - Maximum number of decimal places to use in formatting.\n * @param useOddsMultiplicationFormat - Indicates if multiplication format should be used.\n * @returns - Formatted fractional odds string.\n */\nexport const formatFractional = (\n fractional: { numerator: number; denominator: number } | Fraction,\n isSummary: boolean,\n maxDecimalPlaces: number,\n useOddsMultiplicationFormat: boolean,\n) => {\n if (isSummary || useOddsMultiplicationFormat) {\n return toSimplifiedUKOdds(fractional, maxDecimalPlaces, isSummary);\n }\n const decimalPlaces = min([new Decimal(fractional.numerator).decimalPlaces(), maxDecimalPlaces]) || 0;\n\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n return `${fractional.numerator.toFixed(decimalPlaces)}/${fractional.denominator}`;\n};\n\n/**\n * Attempts to format odds in the main format; if not valid, falls back to alternative formats.\n * @param mainFormat - The primary format to attempt.\n * @param fallbackFormats - List of fallback formats to use if the main format is invalid.\n * @param odds - The odds object containing potential decimal, fractional, or moneyline values.\n * @param input - Formatting options for the odds.\n * @returns - Formatted odds string based on main or fallback format.\n */\nexport const formatOddsWithFallback = (\n mainFormat: OddsDisplayFormat,\n fallbackFormats: OddsDisplayFormat[],\n odds: PartialOdds,\n input: Required,\n) => {\n if (isFormatValid(mainFormat, odds)) {\n return formatOddsInternal(mainFormat, odds, input);\n }\n for (const format of fallbackFormats) {\n if (isFormatValid(format, odds)) {\n const newOdds = OddsConverter.convertOdds(mainFormat, format, odds);\n\n return formatOddsInternal(mainFormat, newOdds, input);\n }\n }\n\n return formatInvalidOdds(mainFormat);\n};\n\n/**\n * Formats user odds by attempting to match the display format, with fallbacks for invalid formats.\n * @param odds - The odds object to format, which may contain decimals, fractional, or moneyline values.\n * @param input - Formatting options including display format and fallback settings.\n * @returns - Formatted odds as a string.\n */\nexport const toFormattedOdds = (odds: PartialOdds, input: Required) => {\n switch (input.displayFormat) {\n case OddsDisplayFormat.EU: {\n return formatOddsWithFallback(OddsDisplayFormat.EU, [OddsDisplayFormat.UK, OddsDisplayFormat.US], odds, input);\n }\n case OddsDisplayFormat.UK: {\n return formatOddsWithFallback(OddsDisplayFormat.UK, [OddsDisplayFormat.EU, OddsDisplayFormat.US], odds, input);\n }\n case OddsDisplayFormat.US: {\n return formatOddsWithFallback(OddsDisplayFormat.US, [OddsDisplayFormat.UK, OddsDisplayFormat.EU], odds, input);\n }\n }\n};\n\n/**\n * Formats odds using configuration input, converting formats if needed and handling invalid odds.\n * @param odds - The odds object, which may contain decimals, fractional, moneyline, or all.\n * @param _input - Input parameters for odds display formatting.\n * @returns - The fully formatted odds string based on provided configuration.\n */\nexport const formatOdds = (odds: CalculatedOdds | Odds, _input: OddsFormatInput) => {\n const input = { ...defaultOddsFormatInput, ..._input } as Required;\n\n if (!odds || !OddsOperations.isOddsValid(odds)) {\n return formatInvalidOdds(input.displayFormat);\n }\n\n if (input.fromFormat && input.displayFormat !== input.fromFormat) {\n const convertedOdds = OddsConverter.convertOdds(input.displayFormat, input.fromFormat, odds);\n\n return toFormattedOdds(convertedOdds, input);\n }\n\n return toFormattedOdds(odds, input);\n};\n\n@Injectable({ providedIn: 'root' })\nexport class OddsFormatterService {\n betslipConfig = inject(BetslipConfig);\n\n /**\n * Formats odds according to user input, including optional conversion to another format.\n * @param odds - The odds object to format.\n * @param input - Input parameters to customize the odds formatting process.\n * @returns - The formatted odds as a string, or an invalid representation if odds are not valid.\n */\n format(odds: Odds | CalculatedOdds | null | undefined, input: OddsFormatInput): string {\n if (!odds || !OddsOperations.isOddsValid(odds)) {\n return formatInvalidOdds(input.displayFormat);\n }\n\n return formatOdds(odds, {\n ...input,\n roundPriceValues: this.betslipConfig.roundPriceValues,\n });\n }\n}\n"],"names":["DECIMAL_PLACES","SUMMARY_VALUE_THRESHOLD","defaultOddsFormatInput","Object","freeze","cutZero","isSummary","maxDecimalPlaces","useOddsMultiplicationFormat","formatInvalidOdds","displayFormat","isFormatValid","format","odds","decimals","OddsOperations","isDecimalOddsValid","fractional","isFractionalOddsValid","moneyline","isMoneyLineOddsValid","toSimplifiedUKOdds","priceValue","Decimal","numerator","dividedBy","denominator","decimalOdds","OddsConverter","fractionToDecimal","Fraction","create","toFixed","decimalPlaces","lessThan","min","ROUND_DOWN","formatOddsInternal","input","formatDecimals","formatFractional","formatMoneyLine","roundPriceValues","moneyLineString","roundAmericanOdds","greaterThan","result","endsWith","formatOddsWithFallback","mainFormat","fallbackFormats","newOdds","convertOdds","toFormattedOdds","formatOdds","_input","__spreadValues","isOddsValid","fromFormat","convertedOdds","OddsFormatterService","constructor","betslipConfig","inject","BetslipConfig","__spreadProps","p","factory","ɵfac","providedIn","_OddsFormatterService"],"mappings":"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"}