/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

#pragma once

#include <memory>

#include "paimon/core/table/source/snapshot/starting_scanner.h"
#include "paimon/core/utils/tag_manager.h"

namespace paimon {
/// `StartingScanner` for the `CoreOptions::GetScanTagName()` of a batch read.
class StaticFromTagStartingScanner : public StartingScanner {
 public:
    StaticFromTagStartingScanner(const std::shared_ptr<SnapshotManager>& snapshot_manager,
                                 const std::string& tag_name)
        : StartingScanner(snapshot_manager) {
        tag_name_ = tag_name;
    }

    Result<std::shared_ptr<ScanResult>> Scan(
        const std::shared_ptr<SnapshotReader>& snapshot_reader) override {
        const TagManager tag_manager(snapshot_manager_->Fs(), snapshot_manager_->RootPath());
        PAIMON_ASSIGN_OR_RAISE(const Tag tag, tag_manager.GetOrThrow(tag_name_));
        PAIMON_ASSIGN_OR_RAISE(const Snapshot snapshot, tag.TrimToSnapshot());
        PAIMON_ASSIGN_OR_RAISE(
            std::shared_ptr<Plan> plan,
            snapshot_reader->WithMode(ScanMode::ALL)->WithSnapshot(snapshot)->Read());
        return std::make_shared<StartingScanner::CurrentSnapshot>(plan);
    }

 private:
    std::string tag_name_;
};
}  // namespace paimon
