#include "ICommand.h"
#include <iostream>


namespace DB
{

namespace ErrorCodes
{
    extern const int BAD_ARGUMENTS;
}

void ICommand::printHelpMessage() const
{
    std::cout << "Command: " << command_name << '\n';
    std::cout << "Description: " << description << '\n';
    std::cout << "Usage: " << usage << '\n';

    if (command_option_description)
    {
        auto options = *command_option_description;
        if (!options.options().empty())
            std::cout << options << '\n';
    }
}

void ICommand::addOptions(ProgramOptionsDescription & options_description)
{
    if (!command_option_description || command_option_description->options().empty())
        return;

    options_description.add(*command_option_description);
}

String ICommand::validatePathAndGetAsRelative(const String & path)
{
    /// If path contain non-normalized symbols like . we will normalized them. If the resulting normalized path
    /// still contain '..' it can be dangerous, disallow such paths. Also since clickhouse-disks
    /// is not an interactive program (don't track you current path) it's OK to disallow .. paths.
    String lexically_normal_path = fs::path(path).lexically_normal();
    if (lexically_normal_path.find("..") != std::string::npos)
        throw DB::Exception(DB::ErrorCodes::BAD_ARGUMENTS, "Path {} is not normalized", path);

    /// If path is absolute we should keep it as relative inside disk, so disk will look like
    /// an ordinary filesystem with root.
    if (fs::path(lexically_normal_path).is_absolute())
        return lexically_normal_path.substr(1);

    return lexically_normal_path;
}

}