// Copyright 2026 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
//
//    https://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.
//

#ifndef THIRD_PARTY_CREDENTIO_FORMATS_TIFF_CONSTANTS_H_
#define THIRD_PARTY_CREDENTIO_FORMATS_TIFF_CONSTANTS_H_

#include <cstdint>

#include "absl/strings/string_view.h"

namespace credentio {

// The size of an IFD Entry: tag (2) + type (2) + count (4) + value/offset (4)
constexpr int64_t kTiffIfdEntrySize = 12;

// The size of an IFD: count (2) + next offset (4) + with a single entry.
constexpr int64_t kTiffIdfOneEntrySize = 6 + kTiffIfdEntrySize;

constexpr uint16_t kTiffBigEndian = 0x4d4d;
constexpr uint16_t kTiffLittleEndian = 0x4949;

constexpr uint16_t kTiffMarker = 0x002a;

constexpr uint32_t kTiffBigEndianHeader = 0x4d4d002a;
// This is for quick asset checking in BigEndian order if the asset is a valid
// LittleEndian TIFF.
constexpr uint32_t kTiffLittleEndianHeader = 0x49492a00;

// This is the tag for the C2PA IFD Entry.
constexpr uint16_t kTiffTagC2pa = 0xcd41;

// These are the tag pairs that are used for offsets and byte counts.
constexpr uint16_t kTiffTagStripOffsets = 0x0111;
constexpr uint16_t kTiffTagStripByteCounts = 0x0117;
constexpr uint16_t kTiffTagFreeOffsets = 0x0120;
constexpr uint16_t kTiffTagFreeByteCounts = 0x0121;
constexpr uint16_t kTiffTagTileOffsets = 0x0144;
constexpr uint16_t kTiffTagTileByteCounts = 0x0145;

// The hex codes for IFD Entry Tags which contain Sub-IFDs.
constexpr uint16_t kTiffTagSubIfd = 0x014a;
constexpr uint16_t kTiffTagExifIfd = 0x8769;
constexpr uint16_t kTiffTagGpsInfo = 0x8825;
constexpr uint16_t kTiffTagInteroptabilityIfd = 0xA005;

// This is the decimal tag for the GPS Info Sub-IFD converted to a string.
constexpr absl::string_view kTiffGpsInfoIdentifier = "34853";

// The maximum valid tag ID in the GPS Info Sub-IFD according to EXIF 2.32.
constexpr uint16_t kMaxGpsTag = 0x001f;

// The hex codes for each of the IFD Entry Types.
constexpr uint16_t kTiffTypeByte = 0x0001;       // uint8_t
constexpr uint16_t kTiffTypeAscii = 0x0002;      // char
constexpr uint16_t kTiffTypeShort = 0x0003;      // uint16_t
constexpr uint16_t kTiffTypeLong = 0x0004;       // uint32_t
constexpr uint16_t kTiffTypeRational = 0x0005;   // uint32_t/uint32_t
constexpr uint16_t kTiffTypeSByte = 0x0006;      // int8_t
constexpr uint16_t kTiffTypeUndefined = 0x0007;  // uint8_t (arbitrary data)
constexpr uint16_t kTiffTypeSShort = 0x0008;     // int16_t
constexpr uint16_t kTiffTypeSLong = 0x0009;      // int32_t
constexpr uint16_t kTiffTypeSRational = 0x000a;  // int32_t/int32_t
constexpr uint16_t kTiffTypeFloat = 0x000b;      // float (4-byte)
constexpr uint16_t kTiffTypeDouble = 0x000c;     // double (8-byte)

constexpr uint64_t SizeOfTiffType(uint16_t field_type) {
  switch (field_type) {
    case kTiffTypeByte:
      return 1;
    case kTiffTypeAscii:
      return 1;
    case kTiffTypeShort:
      return 2;
    case kTiffTypeLong:
      return 4;
    case kTiffTypeRational:
      return 8;
    case kTiffTypeSByte:
      return 1;
    case kTiffTypeUndefined:
      return 1;
    case kTiffTypeSShort:
      return 2;
    case kTiffTypeSLong:
      return 4;
    case kTiffTypeSRational:
      return 8;
    case kTiffTypeFloat:
      return 4;
    case kTiffTypeDouble:
      return 8;
    default:
      return 1;
  }
}

constexpr uint64_t ByteSizeOfImageFileDirectory(uint16_t entry_count) {
  return sizeof(uint16_t) + entry_count * kTiffIfdEntrySize + sizeof(uint32_t);
}

}  // namespace credentio

#endif  // THIRD_PARTY_CREDENTIO_FORMATS_TIFF_CONSTANTS_H_
