import type {
  AndroidAddressType,
  AndroidBarcodeFormat,
  AndroidBarcodeValueType,
  AndroidEmailType,
  AndroidEncryptionType,
  AndroidPhoneType,
} from 'src/constants/android';
import type { Point } from './common';

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.Address}
 */
export interface AndroidAddress {
  addressLines?: string[];
  type?: AndroidAddressType;
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.PersonName}
 */
export interface AndroidPersonName {
  first?: string;
  formattedName?: string;
  last?: string;
  middle?: string;
  prefix?: string;
  pronunciation?: string;
  suffix?: string;
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.ContactInfo}
 */
export interface AndroidContactInfo {
  addresses?: AndroidAddress[];
  emails?: AndroidEmail[];
  name?: AndroidPersonName;
  organization?: string;
  phones?: AndroidPhone[];
  title?: string;
  urls?: string[];
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.Email}
 */
export interface AndroidEmail {
  address?: string;
  body?: string;
  subject?: string;
  type?: AndroidEmailType;
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.Phone}
 */
export interface AndroidPhone {
  number?: string;
  type?: AndroidPhoneType;
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.Sms}
 */
export interface AndroidSms {
  message?: string;
  phoneNumber?: string;
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.UrlBookmark}
 */
export interface AndroidUrlBookmark {
  title?: string;
  url?: string;
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.WiFi}
 */
export interface AndroidWifi {
  encryptionType?: AndroidEncryptionType;
  password?: string;
  ssid?: string;
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.GeoPoint}
 */
export interface AndroidGeoPoint {
  lat?: number;
  lng?: number;
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.CalendarDateTime}
 */
export interface AndroidDate {
  day: number;
  hours: number;
  minutes: number;
  month: number;
  rawValue: string;
  seconds: number;
  year: number;
  isUtc: boolean;
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/Barcode.CalendarEvent}
 */
export interface AndroidCalendarEvent {
  description?: string;
  end?: Date;
  location?: string;
  organizer?: string;
  start?: Date;
  status?: string;
  summary?: string;
}

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/common/Barcode.DriverLicense}
 */
export interface AndroidDriverLicense {
  addressCity?: string;
  addressState?: string;
  addressStreet?: string;
  addressZip?: string;
  birthDate?: string;
  documentType?: string;
  expiryDate?: string;
  firstName?: string;
  gender?: string;
  issueDate?: string;
  issuingCountry?: string;
  lastName?: string;
  licenseNumber?: string;
  middleName?: string;
}

/**
 * {@link https://developer.android.com/reference/android/graphics/Rect.html}
 */
export type AndroidRect = {
  bottom: number;
  left: number;
  right: number;
  top: number;
};

/**
 * {@link https://developers.google.com/android/reference/com/google/mlkit/vision/barcode/common/Barcode}
 */
export type AndroidBarcode = {
  boundingBox: AndroidRect;
  cornerPoints: Point[];
  displayValue: string;
  rawValue: string;
  format: AndroidBarcodeFormat;
  content:
    | {
        type:
          | AndroidBarcodeValueType.UNKNOWN
          | AndroidBarcodeValueType.ISBN
          | AndroidBarcodeValueType.TEXT;
        data: string;
      }
    | {
        type: AndroidBarcodeValueType.CONTACT_INFO;
        data: AndroidContactInfo;
      }
    | {
        type: AndroidBarcodeValueType.EMAIL;
        data: AndroidEmail;
      }
    | {
        type: AndroidBarcodeValueType.PHONE;
        data: AndroidPhone;
      }
    | {
        type: AndroidBarcodeValueType.SMS;
        data: AndroidSms;
      }
    | {
        type: AndroidBarcodeValueType.URL;
        data: AndroidUrlBookmark;
      }
    | {
        type: AndroidBarcodeValueType.WIFI;
        data: AndroidWifi;
      }
    | {
        type: AndroidBarcodeValueType.GEO;
        data: AndroidGeoPoint;
      }
    | {
        type: AndroidBarcodeValueType.CALENDAR_EVENT;
        data: AndroidCalendarEvent;
      }
    | {
        type: AndroidBarcodeValueType.DRIVER_LICENSE;
        data: AndroidDriverLicense;
      };
};
