//
// Decode mac serial number
//
// Copyright (c) 2018-2020 vit9696
// Copyright (c) 2020 Matis Schotte
//

#ifndef GENSERIAL_H
#define GENSERIAL_H

#include <stdbool.h>
#include <stdint.h>

#define PROGRAM_VERSION "2.1.6"

#ifdef __GNUC__
uint32_t arc4random(void) __attribute__((weak));
uint32_t arc4random_uniform(uint32_t upper_bound) __attribute__((weak));
#endif

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

#define SZUUID 16
#define PRIUUID "%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X"
#define CASTUUID(uuid) (uuid)[0], (uuid)[1], (uuid)[2], (uuid)[3], (uuid)[4], (uuid)[5], (uuid)[6], \
  (uuid)[7], (uuid)[8], (uuid)[9], (uuid)[10], (uuid)[11], (uuid)[12], (uuid)[13], (uuid)[14], (uuid)[15]

#define SERIAL_WEEK_MIN 1
#define SERIAL_WEEK_MAX 53
#define SERIAL_YEAR_MIN 2000
#define SERIAL_YEAR_MAX 2030

#define SERIAL_YEAR_OLD_MIN 2003
#define SERIAL_YEAR_OLD_MAX 2012

#define SERIAL_YEAR_NEW_MIN 2010
#define SERIAL_YEAR_NEW_MAX 2020

#define SERIAL_COPY_MIN 1
#define SERIAL_COPY_MAX 34

#define SERIAL_LINE_MIN 0
#define SERIAL_LINE_REPR_MAX 1155
#define SERIAL_LINE_MAX 3399 /* 68*33 + 33*34 + 33 */

#define SERIAL_OLD_LEN 11
#define SERIAL_NEW_LEN 12

#define MODEL_CODE_OLD_LEN 3
#define MODEL_CODE_NEW_LEN 4

#define COUNTRY_OLD_LEN 2
#define COUNTRY_NEW_LEN 3

#define MLB_MAX_SIZE 32

typedef struct {
  const char *productName;
  const char *serialNumber;
} PLATFORMDATA;

typedef struct {
  const char *code;
  const char *name;
} APPLE_MODEL_DESC;

typedef struct {
  const char *appleModel;
  char country[4];
  char year[3];
  char week[3];
  char line[4];
  char model[5];
  int32_t legacyCountryIdx;
  int32_t modernCountryIdx;
  int32_t modelIndex;
  int32_t decodedYear;
  int32_t decodedWeek;
  int32_t decodedCopy;
  int32_t decodedLine;
  bool valid;
} SERIALINFO;

typedef enum {
  MODE_SYSTEM_INFO,
  MODE_SERIAL_INFO,
  MODE_MLB_INFO,
  MODE_LIST_MODELS,
  MODE_LIST_PRODUCTS,
  MODE_GENERATE_MLB,
  MODE_GENERATE_CURRENT,
  MODE_GENERATE_ALL,
  MODE_GENERATE_DERIVATIVES
} PROGRAMMODE;

#endif // GENSERIAL_H