// 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/file.hpp>
#include <flasher/mod.hpp>
#include <flasher/ops.hpp>
#include <flashupdate/args.hpp>
#include <flashupdate/flash.hpp>
#include <flashupdate/ops.hpp>

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

namespace flashupdate
{
namespace ops
{

using flasher::ModArgs;
using stdplus::fd::OpenAccess;
using stdplus::fd::OpenFlag;
using stdplus::fd::OpenFlags;

void erase(const Args& args)
{
    if (args.primary)
    {
        throw std::runtime_error("Does not support primary partition erase");
    }

    auto& flashHelper = args.flashHelper;
    auto flash = flashHelper->getFlash(false);
    if (!flash)
    {
        throw std::runtime_error(
            std::format("Failed to find Flash partition for secondary/{}",
                        args.stagingIndex));
    }

    std::string flashDev(flash->first);
    auto devMod = ModArgs(flashDev);
    flashDev = devMod.arr.back();
    auto dev = flasher::openDevice(devMod);
    flasher::ops::erase(*dev, 0, std::numeric_limits<size_t>::max(),
                        std::nullopt, false);
}

} // namespace ops
} // namespace flashupdate
