// SPDX-FileCopyrightText: © 2021 Matthias Andreas Benkard <code@mail.matthias.benkard.de>
//
// SPDX-License-Identifier: LGPL-3.0-or-later

package eu.mulk.jgvariant.ostree;

import eu.mulk.jgvariant.core.Decoder;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;

/**
 * An entry in a {@link DeltaSuperblock}.
 *
 * <p>Reference: {@code ostree-repo-static-delta-private.h#OSTREE_STATIC_DELTA_META_ENTRY_FORMAT}
 *
 * @param version the version corresponding to the version of {@link DeltaPartPayload}; always 0.
 * @param checksum the checksum of the {@link DeltaPartPayload}.
 * @param compressedSize the total compressed size of the delta.
 * @param uncompressedSize the total uncompressed size of the files generated by the delta.
 * @param objects a list of objects generated by the delta payload.
 */
public record DeltaMetaEntry(
    int version,
    Checksum checksum,
    long compressedSize,
    long uncompressedSize,
    List<DeltaObject> objects) {

  /**
   * A reference to an object generated by a {@link DeltaPartPayload}.
   *
   * @param objectType the file type.
   * @param checksum the checksum of the resulting file.
   */
  public record DeltaObject(ObjectType objectType, Checksum checksum) {

    private static final Decoder<DeltaObject> DECODER =
        Decoder.ofStructure(
            DeltaObject.class, Decoder.ofByte().map(ObjectType::valueOf), Checksum.decoder());

    /**
     * Acquires a {@link Decoder} for the enclosing type.
     *
     * @return a possibly shared {@link Decoder}.
     */
    public static Decoder<DeltaObject> decoder() {
      return DECODER;
    }
  }

  private static final Decoder<DeltaMetaEntry> DECODER =
      Decoder.ofStructure(
          DeltaMetaEntry.class,
          Decoder.ofInt(),
          Checksum.decoder(),
          Decoder.ofLong(),
          Decoder.ofLong(),
          Decoder.ofByteArray().map(DeltaMetaEntry::parseObjectList));

  private static List<DeltaObject> parseObjectList(byte[] bytes) {
    var byteBuffer = ByteBuffer.wrap(bytes);
    List<DeltaObject> objects = new ArrayList<>();

    while (byteBuffer.hasRemaining()) {
      var type = ObjectType.valueOf(byteBuffer.get());
      var checksum = Checksum.readFrom(byteBuffer);
      objects.add(new DeltaObject(type, checksum));
    }

    return objects;
  }

  /**
   * Acquires a {@link Decoder} for the enclosing type.
   *
   * <p><strong>Note:</strong> This decoder has an unspecified {@link ByteOrder}.
   *
   * @return a possibly shared {@link Decoder}.
   */
  public static Decoder<DeltaMetaEntry> decoder() {
    return DECODER;
  }

  DeltaMetaEntry byteSwapped() {
    // FIXME
    return new DeltaMetaEntry(version, checksum, compressedSize, uncompressedSize, objects);
  }
}
