// Copyright 2021 Google LLC
//
// 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 <flasher/ops.hpp>
#include <flashupdate/args.hpp>
#include <flashupdate/info.hpp>
#include <flashupdate/logging.hpp>
#include <flashupdate/ops.hpp>
#include <flashupdate/validator.hpp>

#include <filesystem>
#include <format>
#include <iostream>
#include <string>

namespace flashupdate
{
namespace ops
{
using flasher::ModArgs;
using stdplus::fd::OpenAccess;
using stdplus::fd::OpenFlag;
using stdplus::fd::OpenFlags;

std::string hashDescriptor(const Args& args)
{
    if (args.validatorHelper == nullptr)
    {
        throw std::runtime_error("invalid Validator Helper");
    }

    std::string image = args.file->arr.back();

    auto& helper = args.validatorHelper;
    auto fileMod = ModArgs(image);
    auto inputImage =
        flasher::openFile(fileMod, OpenFlags(OpenAccess::ReadOnly));
    LOG(LogLevel::Info, "CR51 Descriptor HASH for BIOS image: {}, size: {}\n",
        image, inputImage->getSize());
    if (!helper->validateImage(*inputImage, args.config.flash.validationKey))
    {
        throw std::runtime_error(std::format(
            "failed to validate the CR51 descriptor for {}", image));
    }
    std::string output = info::bytesToHex(helper->descriptorHash().hash);
    STDLOG("{}", output);
    return output;
}

} // namespace ops
} // namespace flashupdate
