import { SetMetadata } from '@nestjs/common';
import { DECORATORS } from '../telegraf.constants';
import * as tt from 'telegraf/typings/telegram-types';

export interface UpdateHookOptions {
  updateType:
    | tt.UpdateType
    | tt.UpdateType[]
    | tt.MessageSubTypes
    | tt.MessageSubTypes[];
}

/**
 * New incoming message of any kind — text, photo, sticker, etc.
 * @constructor
 */
export const Message = (): MethodDecorator => {
  return SetMetadata(DECORATORS.UPDATE_HOOK, {
    updateType: 'message',
  });
};

/**
 * New version of a message that is known to the bot and was edited
 * @constructor
 */
export const EditedMessage = (): MethodDecorator => {
  return SetMetadata(DECORATORS.UPDATE_HOOK, {
    updateType: 'edited_message',
  });
};

/**
 * New incoming channel post of any kind — text, photo, sticker, etc.
 * @constructor
 */
export const ChannelPost = (): MethodDecorator => {
  return SetMetadata(DECORATORS.UPDATE_HOOK, {
    updateType: 'channel_post',
  });
};

/**
 * New version of a channel post that is known to the bot and was edited
 * @constructor
 */
export const EditedChannelPost = (): MethodDecorator => {
  return SetMetadata(DECORATORS.UPDATE_HOOK, {
    updateType: 'edited_channel_post',
  });
};

/**
 * New incoming inline query
 * See this decorator in inline-query.decorator.ts
 * @constructor
 */
// export const InlineQuery = (): MethodDecorator => {
//   return SetMetadata(DECORATORS.UPDATE_HOOK, {
//     updateType: 'inline_query',
//   });
// };

/**
 * The result of an inline query that was chosen by a user and sent to their chat partner.
 * @constructor
 */
export const ChosenInlineResult = (): MethodDecorator => {
  return SetMetadata(DECORATORS.UPDATE_HOOK, {
    updateType: 'chosen_inline_result',
  });
};

/**
 * New incoming callback query
 * @constructor
 */
export const CallbackQuery = (): MethodDecorator => {
  return SetMetadata(DECORATORS.UPDATE_HOOK, {
    updateType: 'callback_query',
  });
};

/**
 * New incoming shipping query. Only for invoices with flexible price
 * @constructor
 */
export const ShippingQuery = (): MethodDecorator => {
  return SetMetadata(DECORATORS.UPDATE_HOOK, {
    updateType: 'shipping_query',
  });
};

/**
 * New incoming pre-checkout query. Contains full information about checkout
 * @constructor
 */
export const PreCheckoutQuery = (): MethodDecorator => {
  return SetMetadata(DECORATORS.UPDATE_HOOK, {
    updateType: 'pre_checkout_query',
  });
};

// Two more decorators are missing here. For 'poll' and 'poll_answer' update types.