/*
 *
 *    Copyright (c) 2020 Project CHIP Authors
 *
 *    Licensed 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.
 */

#include <shell/shell.h>

#include <core/CHIPCore.h>
#include <support/Base64.h>
#include <support/CHIPArgParser.hpp>
#include <support/CodeUtils.h>
#include <support/RandUtils.h>

#include <inttypes.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace chip;
using namespace chip::Shell;
using namespace chip::Logging;
using namespace chip::ArgParser;

chip::Shell::Shell theShellBase64;

int cmd_base64_help_iterator(shell_command_t * command, void * arg)
{
    streamer_printf(streamer_get(), "  %-15s %s\n\r", command->cmd_name, command->cmd_help);
    return 0;
}

int cmd_base64_help(int argc, char ** argv)
{
    theShellBase64.ForEachCommand(cmd_base64_help_iterator, NULL);
    return 0;
}

int cmd_base64_decode(int argc, char ** argv)
{
    CHIP_ERROR error  = CHIP_NO_ERROR;
    streamer_t * sout = streamer_get();
    uint32_t binarySize;
    uint8_t binary[256];

    VerifyOrExit(argc > 0, error = CHIP_ERROR_INVALID_ARGUMENT);
    binarySize = Base64Decode(argv[0], sizeof(argv[0]), binary);
    streamer_print_hex(sout, binary, binarySize);
    streamer_printf(sout, "\n\r");

exit:
    return error;
}

int cmd_base64_encode(int argc, char ** argv)
{
    CHIP_ERROR error  = CHIP_NO_ERROR;
    streamer_t * sout = streamer_get();
    char base64[256];
    uint8_t binary[256];
    uint32_t binarySize, base64Size;

    VerifyOrExit(argc > 0, error = CHIP_ERROR_INVALID_ARGUMENT);
    ParseHexString(argv[0], strlen(argv[0]), binary, sizeof(binary), binarySize);
    base64Size = Base64Encode(binary, binarySize, base64);
    streamer_printf(sout, "%.*s\n\r", base64Size, base64);

exit:
    return error;
}

int cmd_base64_dispatch(int argc, char ** argv)
{
    CHIP_ERROR error = CHIP_NO_ERROR;

    VerifyOrExit(argc > 0, error = CHIP_ERROR_INVALID_ARGUMENT);

    error = theShellBase64.ExecCommand(argc, argv);

exit:
    return error;
}

static const shell_command_t cmds_base64_root = { &cmd_base64_dispatch, "base64", "Base64 encode / decode utilities" };

/// Subcommands for root command: `base64 <subcommand>`
static const shell_command_t cmds_base64[] = {
    { &cmd_base64_help, "help", "Usage: base64 <subcommand>" },
    { &cmd_base64_encode, "encode", "Encode a hex sting as base64. Usage: base64 encode <hex_string>" },
    { &cmd_base64_decode, "decode", "Decode a base64 sting as hex. Usage: base64 decode <base64_string>" },
};

void cmd_base64_init(void)
{
    // Register `base64` subcommands with the local shell dispatcher.
    theShellBase64.RegisterCommands(cmds_base64, ARRAY_SIZE(cmds_base64));

    // Register the root `base64` command with the top-level shell.
    shell_register(&cmds_base64_root, 1);
}
