import { describe, it, expect } from 'vitest'

import { datasetKeys } from '@/utils/statistics'
import { formatTooltipValue } from '@/utils/tooltip'

describe('formatTooltipValue', () => {
  const testsParams = [
    {
      description: 'returns 3 if input is average speed',
      inputDisplayedData: datasetKeys[0], // 'average_speed'
      inputValue: 30,
      expectedResult: '30.00 km/h',
    },
    {
      description: 'returns 3 if input is workouts count',
      inputDisplayedData: datasetKeys[1], // 'nb_workouts'
      inputValue: 30,
      expectedResult: '30',
    },
    {
      description: 'returns 00m:03s if input is total duration',
      inputDisplayedData: datasetKeys[2], // 'total_duration'
      inputValue: 30,
      expectedResult: '00m 30s',
    },
    {
      description: 'returns 3.00 km if input is total distance',
      inputDisplayedData: datasetKeys[3], // 'total_distance'
      inputValue: 30,
      expectedResult: '30.00 km',
    },
    {
      description: 'returns 30 km if input is total ascent',
      inputDisplayedData: datasetKeys[4], // 'total_ascent'
      inputValue: 30,
      expectedResult: '30.00 km',
    },
    {
      description: 'returns 30 km if input is total descent',
      inputDisplayedData: datasetKeys[5], // 'total_descent'
      inputValue: 30,
      expectedResult: '30.00 km',
    },
  ]

  testsParams.map((testParams) => {
    it(testParams.description, () => {
      expect(
        formatTooltipValue(
          testParams.inputDisplayedData,
          testParams.inputValue,
          false
        )
      ).toStrictEqual(testParams.expectedResult)
    })
  })
})

describe('formatTooltipValue after conversion to imperial units', () => {
  const testsParams = [
    {
      description: 'returns 30 if input is average speed',
      inputDisplayedData: datasetKeys[0], // 'average_speed'
      inputValue: 30,
      expectedResult: '30.00 mi/h',
    },
    {
      description: 'returns 30 if input is workouts count',
      inputDisplayedData: datasetKeys[1], // 'nb_workouts'
      inputValue: 30,
      expectedResult: '30',
    },
    {
      description: 'returns 00m:03s if input is total duration',
      inputDisplayedData: datasetKeys[2], // 'total_duration'
      inputValue: 30,
      expectedResult: '00m 30s',
    },
    {
      description: 'returns 30 mi if input is total distance',
      inputDisplayedData: datasetKeys[3], // 'total_distance'
      inputValue: 30,
      expectedResult: '30.00 mi',
    },
    {
      description: 'returns 30 mi if input is total ascent',
      inputDisplayedData: datasetKeys[4], // 'total_ascent'
      inputValue: 30,
      expectedResult: '30.00 mi',
    },
    {
      description: 'returns 30 mi if input is total descent',
      inputDisplayedData: datasetKeys[5], // 'total_descent'
      inputValue: 30,
      expectedResult: '30.00 mi',
    },
  ]

  testsParams.map((testParams) => {
    it(testParams.description, () => {
      expect(
        formatTooltipValue(
          testParams.inputDisplayedData,
          testParams.inputValue,
          true
        )
      ).toStrictEqual(testParams.expectedResult)
    })
  })
})

describe('formatTooltipValue with unitFrom', () => {
  const testsParams = [
    {
      description: 'returns 30 km if input is total ascent',
      inputDisplayedData: datasetKeys[4], // 'total_ascent'
      inputValue: 30,
      expectedResult: '30.00 m',
      useImperialUnits: false,
    },
    {
      description: 'returns 30 km if input is total descent',
      inputDisplayedData: datasetKeys[5], // 'total_descent'
      inputValue: 30,
      expectedResult: '30.00 m',
      useImperialUnits: false,
    },
    {
      description: 'returns 30 mi if input is total ascent',
      inputDisplayedData: datasetKeys[4], // 'total_ascent'
      inputValue: 30,
      expectedResult: '30.00 ft',
      useImperialUnits: true,
    },
    {
      description: 'returns 30 mi if input is total descent',
      inputDisplayedData: datasetKeys[5], // 'total_descent'
      inputValue: 30,
      expectedResult: '30.00 ft',
      useImperialUnits: true,
    },
  ]

  testsParams.map((testParams) => {
    it(testParams.description, () => {
      expect(
        formatTooltipValue(
          testParams.inputDisplayedData,
          testParams.inputValue,
          testParams.useImperialUnits,
          true,
          'm'
        )
      ).toStrictEqual(testParams.expectedResult)
    })
  })
})

describe('formatTooltipValue (formatWithUnits = false)', () => {
  const testsParams = [
    {
      description: 'returns 3 if input is average speed',
      inputDisplayedData: datasetKeys[0], // 'average_speed'
      inputValue: 30,
      expectedResult: '30.00 km/h',
    },
    {
      description: 'returns 3 if input is workouts count',
      inputDisplayedData: datasetKeys[1], // 'nb_workouts'
      inputValue: 30,
      expectedResult: '30',
    },
    {
      description: 'returns 00:03 if input is total duration',
      inputDisplayedData: datasetKeys[2], // 'total_duration'
      inputValue: 30,
      expectedResult: '00:30',
    },
    {
      description: 'returns 3.00 km if input is total distance',
      inputDisplayedData: datasetKeys[3], // 'total_distance'
      inputValue: 30,
      expectedResult: '30.00 km',
    },
    {
      description: 'returns 30 km if input is total ascent',
      inputDisplayedData: datasetKeys[4], // 'total_ascent'
      inputValue: 30,
      expectedResult: '30.00 km',
    },
    {
      description: 'returns 30 km if input is total descent',
      inputDisplayedData: datasetKeys[5], // 'total_descent'
      inputValue: 30,
      expectedResult: '30.00 km',
    },
  ]

  testsParams.map((testParams) => {
    it(testParams.description, () => {
      expect(
        formatTooltipValue(
          testParams.inputDisplayedData,
          testParams.inputValue,
          false,
          false
        )
      ).toStrictEqual(testParams.expectedResult)
    })
  })
})
