// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

import { reverseRecord } from '../type.utils.js';

export const COMMAND_CODE = {
  Ping: 1,
  GetStats: 10,
  GetSnapshot: 11,                    // @TODO GET_SNAPSHOT_FILE_CODE: u32 = 11
  GetClusterMetadata: 12,
  DescribeOptions: 13,
  AttachConsumerSession: 14,
  GetMe: 20,
  GetClient: 21,
  GetClients: 22,
  GetUser: 31,
  GetUsers: 32,
  CreateUser: 33,
  DeleteUser: 34,
  UpdateUser: 35,
  UpdatePermissions: 36,
  ChangePassword: 37,
  LoginUser: 38,
  LogoutUser: 39,
  LoginRegister: 40,
  GetAccessTokens: 41,
  CreateAccessToken: 42,
  DeleteAccessToken: 43,
  LoginWithAccessToken: 44,
  LoginRegisterWithAccessToken: 45,
  PollMessages: 100,
  SendMessages: 101,
  FlushUnsavedBuffers: 102,
  GetPollRouting: 103,
  PollMessagesOnPrimary: 104,
  GetOffset: 120,
  StoreOffset: 121,
  DeleteConsumerOffset: 122,
  GetConsumerOffsetRouting: 123,
  GetStream: 200,
  GetStreams: 201,
  CreateStream: 202,
  DeleteStream: 203,
  UpdateStream: 204,
  PurgeStream: 205,
  GetTopic: 300,
  GetTopics: 301,
  CreateTopic: 302,
  DeleteTopic: 303,
  UpdateTopic: 304,
  PurgeTopic: 305,
  CreatePartitions: 402,
  DeletePartitions: 403,
  DeleteSegments: 503,
  GetGroup: 600,
  GetGroups: 601,
  CreateGroup: 602,
  DeleteGroup: 603,
  JoinGroup: 604,
  LeaveGroup: 605,
  SyncGroup: 606,
};

const reverseCommandCodeMap = reverseRecord(COMMAND_CODE);

export const translateCommandCode = (code: number): string => {
  return reverseCommandCodeMap[code] || `unknown_command_code_${code}`
};
