//
//  PixelFormat.swift
//  VisionCamera
//
//  Created by Marc Rousavy on 17.08.23.
//  Copyright © 2023 mrousavy. All rights reserved.
//

import AVFoundation
import Foundation

enum PixelFormat {
  case yuv
  case rgb
  case native
  case unknown

  var unionValue: String {
    switch self {
    case .yuv:
      return "yuv"
    case .rgb:
      return "rgb"
    case .native:
      return "native"
    case .unknown:
      return "unknown"
    }
  }

  init(unionValue: String) throws {
    switch unionValue {
    case "yuv":
      self = .yuv
    case "rgb":
      self = .rgb
    case "native":
      self = .native
    case "unknown":
      self = .unknown
    default:
      throw CameraError.parameter(.invalid(unionName: "pixelFormat", receivedValue: unionValue))
    }
  }

  init(mediaSubType: OSType) {
    switch mediaSubType {
    case kCVPixelFormatType_420YpCbCr8BiPlanarFullRange,
         kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange,
         kCVPixelFormatType_420YpCbCr10BiPlanarFullRange,
         kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange,
         kCVPixelFormatType_Lossless_420YpCbCr8BiPlanarFullRange,
         kCVPixelFormatType_Lossless_420YpCbCr8BiPlanarVideoRange,
         kCVPixelFormatType_Lossless_420YpCbCr10PackedBiPlanarVideoRange:
      self = .yuv
    case kCVPixelFormatType_32BGRA, kCVPixelFormatType_Lossless_32BGRA:
      self = .rgb
    default:
      self = .unknown
    }
  }
}