import dayjs from 'dayjs'

import type { LogsBarChartDatum } from '../ProjectHome/ProjectUsage.metrics'
import {
  computeSuccessAndNonSuccessRates,
  sumErrors,
  sumTotal,
  sumWarnings,
} from '../ProjectHome/ProjectUsage.metrics'

/**
 * Calculates the date range for fetching service health metrics
 * based on the selected interval
 */
export const calculateDateRange = (
  interval: '1hr' | '1day' | '7day'
): { startDate: string; endDate: string } => {
  const now = dayjs()
  const end = now.toISOString()
  let start: string

  switch (interval) {
    case '1hr':
      start = now.subtract(1, 'hour').toISOString()
      break
    case '1day':
      start = now.subtract(1, 'day').toISOString()
      break
    case '7day':
      start = now.subtract(7, 'day').toISOString()
      break
    default:
      start = now.subtract(1, 'hour').toISOString()
  }

  return { startDate: start, endDate: end }
}

export type RawChartData = {
  timestamp: string | number
  ok_count?: number | null
  warning_count?: number | null
  error_count?: number | null
  [key: string]: string | number | null | undefined
}

/**
 * Transforms raw chart query results to LogsBarChartDatum format
 */
export const transformToBarChartData = (data: RawChartData[]): LogsBarChartDatum[] => {
  return data.map((row) => ({
    timestamp: typeof row.timestamp === 'string' ? row.timestamp : String(row.timestamp),
    ok_count: row.ok_count ?? 0,
    warning_count: row.warning_count ?? 0,
    error_count: row.error_count ?? 0,
  }))
}

/**
 * Calculates health metrics from bar chart data
 */
export const calculateHealthMetrics = (eventChartData: LogsBarChartDatum[]) => {
  const total = sumTotal(eventChartData)
  const errorCount = sumErrors(eventChartData)
  const warningCount = sumWarnings(eventChartData)
  const okCount = total - errorCount - warningCount
  const errorRate = total > 0 ? (errorCount / total) * 100 : 0
  const { successRate } = computeSuccessAndNonSuccessRates(total, warningCount, errorCount)

  return {
    total,
    errorRate,
    successRate,
    errorCount,
    warningCount,
    okCount,
  }
}

/**
 * Calculates aggregated metrics across all services
 */
export const calculateAggregatedMetrics = (
  services: {
    total: number
    errorCount: number
    warningCount: number
  }[]
) => {
  const totalRequests = services.reduce((sum, s) => sum + s.total, 0)
  const totalErrors = services.reduce((sum, s) => sum + s.errorCount, 0)
  const totalWarnings = services.reduce((sum, s) => sum + s.warningCount, 0)

  const { successRate: overallSuccessRate, nonSuccessRate: overallErrorRate } =
    computeSuccessAndNonSuccessRates(totalRequests, totalWarnings, totalErrors)

  return {
    totalRequests,
    totalErrors,
    totalWarnings,
    overallErrorRate,
    overallSuccessRate,
  }
}
