package ru.kayashov.bar.bot.domain.command;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import ru.kayashov.bar.bot.annotation.CommandData;
import ru.kayashov.bar.bot.domain.command.api.Command;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Getter
@Component
@RequiredArgsConstructor
public class CommandContainer {

    private final List<Command> commandList;

    @Qualifier("unknownCommand")
    private final Command unknownCommand;

    private final Map<String, Command> commandMap = new HashMap<>();


    /**
     * Метод, собирающий команды, помеченные аннотацией в список
     */
    @PostConstruct
    private void createCommandMap() throws ClassNotFoundException {
        for(Command command : commandList) {
            String proxyName = command.getClass().getName();
            String className = proxyName.substring(0, proxyName.indexOf("$$"));
            String name = Class.forName(className)
                    .getAnnotation(CommandData.class)
                    .name();
            commandMap.put(name, command);
        }
    }

    /**
     * Метод поиска команды
     *
     * @param commandIdentifier - название команды, пришедшее от пользователя
     * @return - Команда бота {@link }, либо сообщение о неизвестной команде
     */
    public Command retrieveCommand(String commandIdentifier) {
        return commandMap.getOrDefault(commandIdentifier, unknownCommand);
    }
}
