// 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/device/mutated.hpp>

#include <cstring>
#include <utility>

namespace flasher
{
namespace device
{

Mutated::Mutated(Mutate& mut, Device& dev) :
    Device(DeviceInfo{dev.getInfo()}), mut(&mut), dev(&dev)
{}

std::span<std::byte> Mutated::readAt(std::span<std::byte> buf, size_t offset)
{
    auto ret = dev->readAt(buf, offset);
    mut->reverse(ret, offset);
    return ret;
}

std::span<const std::byte>
    Mutated::writeAt(std::span<const std::byte> data, size_t offset)
{
    if (buf.size() < data.size())
        buf.resize(data.size());
    if (!data.empty())
        std::memcpy(buf.data(), data.data(), data.size());
    auto ret = std::span<std::byte>(buf).subspan(0, data.size());
    mut->forward(ret, offset);
    return data.subspan(0, dev->writeAt(ret, offset).size());
}

void Mutated::eraseBlocks(size_t idx, size_t num)
{
    dev->eraseBlocks(idx, num);
}

MutatedOwned::MutatedOwned(std::unique_ptr<Mutate>&& mut,
                           std::unique_ptr<Device>&& dev) :
    Mutated(*mut, *dev), mut(std::move(mut)), dev(std::move(dev))
{}

} // namespace device
} // namespace flasher
