export const baseResponseCodes = {
  SUCCESS: 0,
  NOT_FOUND: 1,
  ALREADY_EXISTS: 2,
  INVALID_FIELDS: 3,
  ERROR: 4,
  INVALID_CUSTOM_FIELDS: 5,
  IN_USE: 6,
} as const;

export type BaseResponseCodeKey = keyof typeof baseResponseCodes;

export interface EntityDefinition {
  name: string;
  customCodes?: string[];
}

export interface EntityWithKey extends EntityDefinition {
  key: number;
}

const entitiesAndCustomCodes: EntityDefinition[] = [
  { name: 'Country', customCodes: ['COUNTRY_DISABLED'] },
  { name: 'City', customCodes: ['CITY_IS_CAPITAL'] },
  { name: 'Company' },
  { name: 'SubCompany' },
  {
    name: 'User',
    customCodes: [
      'USER_DISABLED',
      'EMAIL_ALREADY_TAKEN',
      'USER_ALREADY_INACTIVE',
      'PASSWORD_RESET_FAILED',
      'TOKEN_INVALID',
      'INCORRECT_OLD_PASSWORD',
      'USER_ALREADY_INACTIVE',
      'ACTIVE_USER_WITH_SAME_NUMBER_EXISTS',
      'USER_ALREADY_ACTIVE_WITH_EMAIL_OR_PHONE',
    ],
  },
  { name: 'Category' },
  { name: 'SubCategory' },
  { name: 'PropertyUsage' },
  { name: 'PropertySize' },
  { name: 'Amenities' },
  { name: 'Source' },
  { name: 'Tag' },
  { name: 'Location' },
  {
    name: 'Role',
    customCodes: ['ROLE_CREATION_FAILED', 'ROLE_UPDATE_FORBIDDEN'],
  },
  { name: 'Configuration' },
  { name: 'Permission', customCodes: ['PERMISSION_UPDATE_FORBIDDEN'] },
  { name: 'IndividualProperties' },
  { name: 'primaryProperty' },
  { name: 'Contact' },
  {
    name: 'Team',
    customCodes: [
      'TEAM_CREATION_FAILED',
      'LEAD_CANNOT_BE_MEMBER',
      'INVALID_COMPANY',
      'INVALID_TEAM_MEMBERS',
    ],
  },
  {
    name: 'Support',
  },
  {
    name: 'LeadStage',
  },
  {
    name: 'Otp',
    customCodes: ['OTP_EXPIRED', 'INVALID_OTP', 'FAILED_TO_SEND_OTP'],
  },
  {
    name: 'MakanifySites',
    customCodes: [
      'MAKANIFY_SITES_FETCHED',
      'MAKANIFY_SITES_NOT_FOUND',
      'MAKANIFY_LEAD_CREATED',
      'SUBDOMAIN_RESERVED',
    ],
  },
  {
    name: 'Lead',
  },
  {
    name: 'Project',
    customCodes: ['PROJECT_DUPLICATE', 'PROJECT_ERROR', 'PROJECT_NOT_FOUND'],
  },
  { name: 'State' },
  { name: 'Area' },
  { name: 'Category' },
  { name: 'SubCategory' },
  { name: 'Configuration' },
  { name: 'PropertySize' },
  { name: 'PropertyUsage' },
  { name: 'Amenities' },
  { name: 'Source' },
  { name: 'Tag' },
  {
    name: 'BankAccount',
  },
  {
    name: 'MasterBank',
  },
  {
    name: 'Tasks',
  },
  {
    name: 'Targets',
  },
  {
    name: 'PaymentPlan',
  },
  {
    name: 'ProjectCharge',
  },
  {
    name: 'InvoiceSettings',
  },
  {
    name: 'Documents',
  },
  {
    name: 'Quotation',
  },
  {
    name: 'Activity',
  },
  {
    name: 'PaymentTerm',
  },
  {
    name: 'Invoice',
  },
  {
    name: 'Timeline',
  },
  {
    name: 'File',
  },
  {
    name: 'UnitBookingOrHold',
  },
  {
    name: 'Notification',
  },
  {
    name: 'PropertyFile',
  },
  {
    name: 'Customer',
  },
  {
    name: 'Campaign',
  },
  {
    name: 'CustomFields',
  },
  {
    name: 'PartnerNetwork',
  },
  {
    name: 'LeadScore',
  },
  {
    name: 'Rules',
  },
  {
    name: 'Dashboard',
  },
  {
    name: 'Whatsapp',
    customCodes: ['COMPANY_NOT_FOUND'],
  },
  {
    name: 'Fast2sms',
    customCodes: [
      'COMPANY_NOT_FOUND',
      'BULK_UPSERT_ERROR',
      'COMPANY_SENDER_ID_NOT_FOUND',
    ],
  },
  {
    name: 'ClickStats',
  },
  {
    name: 'Reports',
  },
  {
    name: 'Email',
  },
  {
    name: 'CaptureLead',
  },
  {
    name: 'ChannelPartner',
  },
];

export const generateEntitiesWithKeys = (
  entities: EntityDefinition[],
): EntityWithKey[] => {
  let lastKey = 1000;

  return entities.map((entity) => {
    const entityWithKey: EntityWithKey = {
      ...entity,
      key: lastKey,
    };
    lastKey += 1000;
    return entityWithKey;
  });
};

// Final result with keys
export const entities = generateEntitiesWithKeys(entitiesAndCustomCodes);
