import { CommandParser } from '@redis/client/dist/lib/client/parser';
import { RedisArgument, SimpleStringReply, Command } from '@redis/client/dist/lib/RESP/types';

export const TIME_SERIES_AGGREGATION_TYPE = {
  AVG: 'AVG',
  FIRST: 'FIRST',
  LAST: 'LAST',
  MIN: 'MIN',
  MAX: 'MAX',
  SUM: 'SUM',
  RANGE: 'RANGE',
  COUNT: 'COUNT',
  /**
  * Available since 8.6
  */
  COUNT_NAN: 'COUNTNAN',
  /**
  * Available since 8.6
  */
  COUNT_ALL: 'COUNTALL',
  STD_P: 'STD.P',
  STD_S: 'STD.S',
  VAR_P: 'VAR.P',
  VAR_S: 'VAR.S',
  TWA: 'TWA'
} as const;

export type TimeSeriesAggregationType = typeof TIME_SERIES_AGGREGATION_TYPE[keyof typeof TIME_SERIES_AGGREGATION_TYPE];

export default {
  IS_READ_ONLY: false,
  /**
   * Creates a compaction rule from source time series to destination time series
   * @param parser - The command parser
   * @param sourceKey - The source time series key
   * @param destinationKey - The destination time series key
   * @param aggregationType - The aggregation type to use
   * @param bucketDuration - The duration of each bucket in milliseconds
   * @param alignTimestamp - Optional timestamp for alignment
   */
  parseCommand(
    parser: CommandParser,
    sourceKey: RedisArgument,
    destinationKey: RedisArgument,
    aggregationType: TimeSeriesAggregationType,
    bucketDuration: number,
    alignTimestamp?: number
  ) {
    parser.push('TS.CREATERULE');
    parser.pushKeys([sourceKey, destinationKey]);
    parser.push('AGGREGATION', aggregationType, bucketDuration.toString());

    if (alignTimestamp !== undefined) {
      parser.push(alignTimestamp.toString());
    }
  },
  transformReply: undefined as unknown as () => SimpleStringReply<'OK'>
} as const satisfies Command;
