/*
 *
 *    Copyright (c) 2021-2022 Project CHIP Authors
 *    Copyright (c) 2013-2017 Nest Labs, Inc.
 *    All rights reserved.
 *
 *    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.
 */

/**
 *    @file
 *      This file implements the CHIP certificate (chip-cert) command line tool.
 *
 *      The 'chip-cert' command line tool is used, primarily, for generating
 *      and manipulating CHIP certificate and private key material.
 *
 */

#include "chip-cert.h"
#include <assert.h>

namespace {

// clang-format off
const char * const sHelp =
    "Usage: chip-cert <command> [ <args...> ]\n"
    "\n"
    "Commands:\n"
    "\n"
    "    gen-cert -- Generate a CHIP certificate.\n"
    "\n"
    "    convert-cert -- Convert a certificate between CHIP and X509 form.\n"
    "\n"
    "    convert-key -- Convert a private key between CHIP and PEM/DER form.\n"
    "\n"
    "    resign-cert -- Resign a CHIP certificate using a new CA key.\n"
    "\n"
    "    validate-cert -- Validate a CHIP certificate chain.\n"
    "\n"
    "    print-cert -- Print a CHIP certificate.\n"
    "\n"
    "    gen-att-cert -- Generate a CHIP attestation certificate.\n"
    "\n"
    "    validate-att-cert -- Validate a CHIP attestation certificate chain.\n"
    "\n"
    "    gen-cd -- Generate a CHIP certification declaration signed message.\n"
    "\n"
    "    print-cd -- Print a CHIP certification declaration (CD) content.\n"
    "\n"
    "    print-tlv -- Print a CHIP TLV structure.\n"
    "\n"
    "    version -- Print the program version and exit.\n"
    "\n";
// clang-format on

/**
 * Print to standard output the program version information.
 *
 * @return Unconditionally returns true.
 *
 */
bool PrintVersion()
{
    printf("chip " CHIP_VERSION_STRING "\n" COPYRIGHT_STRING);

    return true;
}

} // namespace

int main(int argc, char * argv[])
{
    bool res = false;

    SuccessOrDie(chip::Platform::MemoryInit());

    if (argc == 1)
    {
        fprintf(stderr, "Please specify a command, or 'help' for help.\n");
    }
    else if (strcasecmp(argv[1], "help") == 0 || strcasecmp(argv[1], "--help") == 0 || strcasecmp(argv[1], "-h") == 0)
    {
        res = (fputs(sHelp, stdout) != EOF);
    }
    else if (strcasecmp(argv[1], "version") == 0 || strcasecmp(argv[1], "--version") == 0 || strcasecmp(argv[1], "-v") == 0)
    {
        res = PrintVersion();
    }
    else if (strcasecmp(argv[1], "gen-cert") == 0 || strcasecmp(argv[1], "gencert") == 0)
    {
        res = Cmd_GenCert(argc - 1, argv + 1);
    }
    else if (strcasecmp(argv[1], "convert-cert") == 0 || strcasecmp(argv[1], "convertcert") == 0)
    {
        res = Cmd_ConvertCert(argc - 1, argv + 1);
    }
    else if (strcasecmp(argv[1], "convert-key") == 0 || strcasecmp(argv[1], "convertkey") == 0)
    {
        res = Cmd_ConvertKey(argc - 1, argv + 1);
    }
    else if (strcasecmp(argv[1], "resign-cert") == 0 || strcasecmp(argv[1], "resigncert") == 0)
    {
        res = Cmd_ResignCert(argc - 1, argv + 1);
    }
    else if (strcasecmp(argv[1], "validate-cert") == 0 || strcasecmp(argv[1], "validatecert") == 0)
    {
        res = Cmd_ValidateCert(argc - 1, argv + 1);
    }
    else if (strcasecmp(argv[1], "print-cert") == 0 || strcasecmp(argv[1], "printcert") == 0)
    {
        res = Cmd_PrintCert(argc - 1, argv + 1);
    }
    else if (strcasecmp(argv[1], "gen-att-cert") == 0 || strcasecmp(argv[1], "genattcert") == 0)
    {
        res = Cmd_GenAttCert(argc - 1, argv + 1);
    }
    else if (strcasecmp(argv[1], "validate-att-cert") == 0 || strcasecmp(argv[1], "validateattcert") == 0)
    {
        res = Cmd_ValidateAttCert(argc - 1, argv + 1);
    }
    else if (strcasecmp(argv[1], "gen-cd") == 0 || strcasecmp(argv[1], "gencd") == 0)
    {
        res = Cmd_GenCD(argc - 1, argv + 1);
    }
    else if (strcasecmp(argv[1], "print-cd") == 0 || strcasecmp(argv[1], "printcd") == 0)
    {
        res = Cmd_PrintCD(argc - 1, argv + 1);
    }
    else if (strcasecmp(argv[1], "print-tlv") == 0 || strcasecmp(argv[1], "printtlv") == 0)
    {
        res = Cmd_PrintTLV(argc - 1, argv + 1);
    }
    else
    {
        fprintf(stderr, "Unrecognized command: %s\n", argv[1]);
    }

    return res ? 0 : -1;
}
