/*
 * 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 <cstdint>
#include <string>

#include "paimon/data/shredding/map_shared_shredding_schema_utils.h"

namespace paimon {

/// Constants for MAP storage layout marker.
struct MapShreddingDefine {
    /// Marker key indicating this file uses a specific MAP storage layout.
    static constexpr const char* kStorageLayout = "paimon.map.storage-layout";
    /// Value for kStorageLayout when using shared-shredding layout.
    static constexpr const char* kStorageLayoutSharedShredding = "shared-shredding";
};

/// Constants for the shared-shredding MAP storage layout.
/// Includes file footer meta keys and physical sub-column names.
struct MapSharedShreddingDefine {
    // ---- File footer meta keys ----

    /// Version of the shared-shredding meta format.
    static constexpr const char* kVersion = "paimon.map.shared-shredding.version";
    /// Current meta format version.
    static constexpr int32_t kCurrentVersion = 1;
    /// JSON-encoded field name <-> field id dictionary (may be compressed).
    static constexpr const char* kFieldDict = "paimon.map.shared-shredding.field-dict";
    /// Compression codec used by field_dict. Missing in legacy files, which default to zstd.
    static constexpr const char* kFieldDictCompression =
        "paimon.map.shared-shredding.field-dict-compression";
    /// Original (uncompressed) size of field_dict value.
    static constexpr const char* kFieldDictOriginalSize =
        "paimon.map.shared-shredding.field-dict-original-size";
    /// JSON-encoded field_id -> set of physical column indices.
    static constexpr const char* kFieldColumns = "paimon.map.shared-shredding.field-columns";
    /// JSON-encoded set of field_ids that ever spilled into __overflow.
    static constexpr const char* kOverflowSet = "paimon.map.shared-shredding.overflow-set";
    /// The number of physical columns K used in this file.
    static constexpr const char* kNumColumns = "paimon.map.shared-shredding.num-columns";
    /// The maximum row width observed in this file.
    static constexpr const char* kMaxRowWidth = "paimon.map.shared-shredding.max-row-width";

    // ---- Physical sub-column names ----

    /// Per-row field mapping column name.
    static constexpr const char* kFieldMapping = "__field_mapping";
    /// Overflow column name.
    static constexpr const char* kOverflow = "__overflow";

    /// Default compression codec for field_dict serialization.
    static constexpr const char* kDefaultDictCompression = "zstd";

    /// Returns the name of the i-th physical column: "__col_0", "__col_1", etc.
    static std::string PhysicalColumnName(int32_t index) {
        return "__col_" + std::to_string(index);
    }
};

}  // namespace paimon
