<?php
declare(strict_types=1);

/**
 *--------------------------------------------------------------------
 *
 * GS1 AI Data.
 *
 *--------------------------------------------------------------------
 * Copyright (C) Jean-Sebastien Goupil
 * http://www.barcodebakery.com
 */
namespace BarcodeBakery\Common\GS1;

use BarcodeBakery\Common\GS1\AIData;
use BarcodeBakery\Common\GS1\KindOfData;

class GS1AI
{
    /**
     * Gets the default AI Data.
     *
     * @return array[AIData]
     */
    public static function getDefaultAIData() {
        return array(
            new AIData('00',   KindOfData::NUMERIC,          18, 18, true,  'Serial Shipping Container Code (SSCC-18)'),
            new AIData('01',   KindOfData::NUMERIC,          14, 14, true,  'Global Trade Item Number (GTIN)'),
            new AIData('02',   KindOfData::NUMERIC,          14, 14, true,  'GTIN of Contained Trade Items'),
            new AIData('10',   KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Batch or Lot Number'),
            new AIData('11',   KindOfData::DATE,             6,  6,  false, 'Production Date'),
            new AIData('12',   KindOfData::DATE,             6,  6,  false, 'Due Date'),
            new AIData('13',   KindOfData::DATE,             6,  6,  false, 'Packaging Date'),
            new AIData('15',   KindOfData::DATE,             6,  6,  false, 'Best Before Date'),
            new AIData('16',   KindOfData::DATE,             6,  6,  false, 'Sell By Date'),
            new AIData('17',   KindOfData::DATE,             6,  6,  false, 'Expiration Date'),
            new AIData('20',   KindOfData::NUMERIC,          2,  2,  false, 'Internal Product Variant'),
            new AIData('21',   KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Serial Number'),
            new AIData('22',   KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Consumer Product Variant'),
            new AIData('235',  KindOfData::ALPHA_NUMERIC,    1,  28, false, 'Third Party Controlled, Serialised Extension of GTIN (TPX)'),
            new AIData('240',  KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Additional Item Identification'),
            new AIData('241',  KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Customer Part Number'),
            new AIData('242',  KindOfData::ALPHA_NUMERIC,    1,  6,  false, 'Made-to-Order Variation Number'),
            new AIData('243',  KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Packaging Comnponent Number'),
            new AIData('250',  KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Second Serial Number'),
            new AIData('251',  KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Reference to Source Entity'),
            new AIData('253',  KindOfData::NUMERIC,          14, 30, false, 'Global Document Type Identifier (GDTI)'),
            new AIData('254',  KindOfData::NUMERIC,          1,  20, false, 'GLN Extension Component'),
            new AIData('255',  KindOfData::NUMERIC,          14, 25, false, 'Global Coupon Number (GCN)'),
            new AIData('30',   KindOfData::NUMERIC,          1,  8,  false, 'Variable Count of Items (variable measure trade item)'),
            new AIData('310y', KindOfData::NUMERIC,          6,  6,  false, 'Net Weight in kilograms (variable measure trade item)'),
            new AIData('311y', KindOfData::NUMERIC,          6,  6,  false, 'Length or 1st Dimension, in meters (variable measure trade item)'),
            new AIData('312y', KindOfData::NUMERIC,          6,  6,  false, 'Width, Diameter, or 2nd Dimension, in meters (variable measure trade item)'),
            new AIData('313y', KindOfData::NUMERIC,          6,  6,  false, 'Depth, Thickness, Height, or 3rd Dimension, in meters (variable measure trade item)'),
            new AIData('314y', KindOfData::NUMERIC,          6,  6,  false, 'Area, in square meters (variable measure trade item)'),
            new AIData('315y', KindOfData::NUMERIC,          6,  6,  false, 'Net Volume, in liters (variable measure trade item)'),
            new AIData('316y', KindOfData::NUMERIC,          6,  6,  false, 'Net Volume, in cubic meters (variable measure trade item)'),
            new AIData('320y', KindOfData::NUMERIC,          6,  6,  false, 'Net Weight, in pounds (variable measure trade item)'),
            new AIData('321y', KindOfData::NUMERIC,          6,  6,  false, 'Length or 1st Dimension, in inches (variable measure trade item)'),
            new AIData('322y', KindOfData::NUMERIC,          6,  6,  false, 'Length or 1st Dimension, in feet (variable measure trade item)'),
            new AIData('323y', KindOfData::NUMERIC,          6,  6,  false, 'Length, 1st Dimension, in yards (variable measure trade item)'),
            new AIData('324y', KindOfData::NUMERIC,          6,  6,  false, 'Width, Diameter, or 2nd Dimension, in inches (variable measure trade item)'),
            new AIData('325y', KindOfData::NUMERIC,          6,  6,  false, 'Width, Diameter, or 2nd Dimension, in feet (variable measure trade item)'),
            new AIData('326y', KindOfData::NUMERIC,          6,  6,  false, 'Width, Diameter, or 2nd Dimension, in yards (variable measure trade item)'),
            new AIData('327y', KindOfData::NUMERIC,          6,  6,  false, 'Depth, Thickness, Height, or 3rd Dimension, in inches (variable measure trade item)'),
            new AIData('328y', KindOfData::NUMERIC,          6,  6,  false, 'Depth, Thickness, Height, or 3rd Dimension, in feet (variable measure trade item)'),
            new AIData('329y', KindOfData::NUMERIC,          6,  6,  false, 'Depth, Thickness, Height, or 3rd Dimension, in yards (variable measure trade item)'),
            new AIData('330y', KindOfData::NUMERIC,          6,  6,  false, 'Logistic Weight, in kilograms'),
            new AIData('331y', KindOfData::NUMERIC,          6,  6,  false, 'Length, or 1st Dimension, in meters'),
            new AIData('332y', KindOfData::NUMERIC,          6,  6,  false, 'Width, Diameter, or 2nd Dimension, in meters'),
            new AIData('333y', KindOfData::NUMERIC,          6,  6,  false, 'Depth, Thickness, Height, or 3rd Dimension, in meters'),
            new AIData('334y', KindOfData::NUMERIC,          6,  6,  false, 'Area, in square meters'),
            new AIData('335y', KindOfData::NUMERIC,          6,  6,  false, 'Logistic Volume, in liters'),
            new AIData('336y', KindOfData::NUMERIC,          6,  6,  false, 'Logistic Volume, in cubic meters'),
            new AIData('337y', KindOfData::NUMERIC,          6,  6,  false, 'Kilograms per square meter'),
            new AIData('340y', KindOfData::NUMERIC,          6,  6,  false, 'Logistic Weight, in pounds'),
            new AIData('341y', KindOfData::NUMERIC,          6,  6,  false, 'Length or 1st Dimension, in inches'),
            new AIData('342y', KindOfData::NUMERIC,          6,  6,  false, 'Length or 1st Dimension, in feet'),
            new AIData('343y', KindOfData::NUMERIC,          6,  6,  false, 'Container Length/1st Dimension in, in yards'),
            new AIData('344y', KindOfData::NUMERIC,          6,  6,  false, 'Width, Diameter, or 2nd Dimension, in inches'),
            new AIData('345y', KindOfData::NUMERIC,          6,  6,  false, 'Width, Diameter, or 2nd Dimension, in feet'),
            new AIData('346y', KindOfData::NUMERIC,          6,  6,  false, 'Width, Diameter, or 2nd Dimension, in yards'),
            new AIData('347y', KindOfData::NUMERIC,          6,  6,  false, 'Depth, Thickness, Height, or 3rd Dimension, in inches'),
            new AIData('348y', KindOfData::NUMERIC,          6,  6,  false, 'Depth, Thickness, Height, or 3rd Dimension, in feet'),
            new AIData('349y', KindOfData::NUMERIC,          6,  6,  false, 'Depth, Thickness, Height, 3rd Dimension, in yards'),
            new AIData('350y', KindOfData::NUMERIC,          6,  6,  false, 'Area, in square inches (variable measure trade item)'),
            new AIData('351y', KindOfData::NUMERIC,          6,  6,  false, 'Area, in square feet (variable measure trade item)'),
            new AIData('352y', KindOfData::NUMERIC,          6,  6,  false, 'Area, in square yards (variable measure trade item)'),
            new AIData('353y', KindOfData::NUMERIC,          6,  6,  false, 'Area, in square inches'),
            new AIData('354y', KindOfData::NUMERIC,          6,  6,  false, 'Area, in square feet'),
            new AIData('355y', KindOfData::NUMERIC,          6,  6,  false, 'Area, in square yards'),
            new AIData('356y', KindOfData::NUMERIC,          6,  6,  false, 'Net Weight, in troy ounces (variable measure trade item)'),
            new AIData('357y', KindOfData::NUMERIC,          6,  6,  false, 'Net Weight or volume, in ounces (variable measure trade item)'),
            new AIData('360y', KindOfData::NUMERIC,          6,  6,  false, 'Net Volume, in quarts (variable measure trade item)'),
            new AIData('361y', KindOfData::NUMERIC,          6,  6,  false, 'Net Volume, in U.S. gallons (variable measure trade item)'),
            new AIData('362y', KindOfData::NUMERIC,          6,  6,  false, 'Logistic Volume, in quarts'),
            new AIData('363y', KindOfData::NUMERIC,          6,  6,  false, 'Logistic Volume, in U.S. gallons'),
            new AIData('364y', KindOfData::NUMERIC,          6,  6,  false, 'Net Volume, in cubic inches (variable measure trade item)'),
            new AIData('365y', KindOfData::NUMERIC,          6,  6,  false, 'Net Volume, in cubic feet (variable measure trade item)'),
            new AIData('366y', KindOfData::NUMERIC,          6,  6,  false, 'Net Volume, in cubic yards (variable measure trade item)'),
            new AIData('367y', KindOfData::NUMERIC,          6,  6,  false, 'Logistic Volume, in cubic inches'),
            new AIData('368y', KindOfData::NUMERIC,          6,  6,  false, 'Logistic Volume, in cubic feet'),
            new AIData('369y', KindOfData::NUMERIC,          6,  6,  false, 'Logistic Volume, in cubic yards'),
            new AIData('37',   KindOfData::NUMERIC,          1,  8,  false, 'Count of trade items'),
            new AIData('390y', KindOfData::NUMERIC,          1,  15, false, 'Applicable Amount Payable or Coupon Value, in local currency'),
            new AIData('391y', KindOfData::NUMERIC,          4,  18, false, 'Applicable Amount Payable with ISO Currency Code'),
            new AIData('392y', KindOfData::NUMERIC,          1,  15, false, 'Applicable Amount Payable, Single Monetary Area (variable measure trade item)'),
            new AIData('393y', KindOfData::NUMERIC,          4,  18, false, 'Applicable Amount Payable With ISO Currency Code (variable measure trade item)'),
            new AIData('394y', KindOfData::NUMERIC,          4,  4,  false, 'Percentage Discount of a Coupon'),
            new AIData('395y', KindOfData::NUMERIC,          6,  6,  false, 'Amount Payable per unit of measure single monetary area (variable measure trade item)'),
            new AIData('400',  KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Customer\'s Purchase Order Number'),
            new AIData('401',  KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Global Identification Number for Consignment (GINC)'),
            new AIData('402',  KindOfData::NUMERIC,          17, 17, false, 'Global Shipment Identification Number (GSIN)'),
            new AIData('403',  KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Routing Code'),
            new AIData('410',  KindOfData::NUMERIC,          13, 13, true,  'Ship To/Deliver To Global Location Number'),
            new AIData('411',  KindOfData::NUMERIC,          13, 13, true,  'Bill To/Invoice To Global Location Number'),
            new AIData('412',  KindOfData::NUMERIC,          13, 13, true,  'Purchased From Global Location Number'),
            new AIData('413',  KindOfData::NUMERIC,          13, 13, true,  'Ship For/Deliver For/Forward To Global Location Number'),
            new AIData('414',  KindOfData::NUMERIC,          13, 13, true,  'Identification of a Physical Location - Global Location Number'),
            new AIData('415',  KindOfData::NUMERIC,          13, 13, true,  'Global Location Number of The Invoicing Party'),
            new AIData('416',  KindOfData::NUMERIC,          13, 13, true,  'Global Location Number of The Production or Service Location'),
            new AIData('417',  KindOfData::NUMERIC,          13, 13, true,  'Party GLN'),
            new AIData('420',  KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Ship To/Deliver To Postal Code Within a Single Postal Authority'),
            new AIData('421',  KindOfData::ALPHA_NUMERIC,    4,  12, false, 'Ship To/Deliver To Postal Code With ISO Country Code'),
            new AIData('422',  KindOfData::NUMERIC,          3,  3,  false, 'Country of Origin of a Trade Item'),
            new AIData('423',  KindOfData::NUMERIC,          3,  15, false, 'Country of Initial Processing'),
            new AIData('424',  KindOfData::NUMERIC,          3,  3,  false, 'Country of Processing'),
            new AIData('425',  KindOfData::NUMERIC,          3,  3,  false, 'Country of Disassembly'),
            new AIData('426',  KindOfData::NUMERIC,          3,  3,  false, 'Country Covering Full Process Chain'),
            new AIData('427',  KindOfData::ALPHA_NUMERIC,    1,  3,  false, 'Country Subdivision of Origin'),
            new AIData('4300', KindOfData::ALPHA_NUMERIC,    1,  35, false, 'Ship-to / Deliver-to company name'),
            new AIData('4301', KindOfData::ALPHA_NUMERIC,    1,  35, false, 'Ship-to / Deliver-to contact'),
            new AIData('4302', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Ship-to / Deliver-to address line 1'),
            new AIData('4303', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Ship-to / Deliver-to address line 2'),
            new AIData('4304', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Ship-to / Deliver-to suburb'),
            new AIData('4305', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Ship-to / Deliver-to locality'),
            new AIData('4306', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Ship-to / Deliver-to region'),
            new AIData('4307', KindOfData::ALPHA_NUMERIC,    2,  2,  false, 'Ship-to / Deliver-to country code'),
            new AIData('4308', KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Ship-to / Deliver-to telephone number'),
            new AIData('4310', KindOfData::ALPHA_NUMERIC,    1,  35, false, 'Return-to company name'),
            new AIData('4311', KindOfData::ALPHA_NUMERIC,    1,  35, false, 'Return-to contact'),
            new AIData('4312', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Return-to address line 1'),
            new AIData('4313', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Return-to address line 2'),
            new AIData('4314', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Return-to suburb'),
            new AIData('4315', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Return-to locality'),
            new AIData('4316', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Return-to region'),
            new AIData('4317', KindOfData::ALPHA_NUMERIC,    2,  2,  false, 'Return-to country code'),
            new AIData('4318', KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Return-to postal code'),
            new AIData('4319', KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Return-to telephone number'),
            new AIData('4320', KindOfData::ALPHA_NUMERIC,    1,  35, false, 'Service code description'),
            new AIData('4321', KindOfData::NUMERIC,          1,  1,  false, 'Dangerous goods flag'),
            new AIData('4322', KindOfData::NUMERIC,          1,  1,  false, 'Authority to leave'),
            new AIData('4323', KindOfData::NUMERIC,          1,  1,  false, 'Signature required flag'),
            new AIData('4324', KindOfData::DATETIME,         10, 10, false, 'Not before delivery date time'),
            new AIData('4325', KindOfData::DATETIME,         10, 10, false, 'Not after delivery date time'),
            new AIData('4326', KindOfData::DATE,             6,  6,  false, 'Release date'),
            new AIData('7001', KindOfData::NUMERIC,          13, 13, false, 'NATO Stock Number (NSN)'),
            new AIData('7002', KindOfData::ALPHA_NUMERIC,    1,  30, false, 'UN/ECE Meat Carcasses and Cuts Classification'),
            new AIData('7003', KindOfData::DATETIME,         10, 10, false, 'Expiration Date and Time'),
            new AIData('7004', KindOfData::NUMERIC,          1,  4,  false, 'Active Potency'),
            new AIData('7005', KindOfData::ALPHA_NUMERIC,    1,  12, false, 'Catch Area'),
            new AIData('7006', KindOfData::DATE,             6,  6,  false, 'First Freeze Date'),
            new AIData('7007', KindOfData::NUMERIC,          6,  12, false, 'Harvest Date'),
            new AIData('7008', KindOfData::ALPHA_NUMERIC,    1,  3,  false, 'Species For Fishery Purposes'),
            new AIData('7009', KindOfData::ALPHA_NUMERIC,    1,  10, false, 'Fishing Gear Type'),
            new AIData('7010', KindOfData::ALPHA_NUMERIC,    1,  2,  false, 'Production Method'),
            new AIData('7020', KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Refurbishment Lot ID'),
            new AIData('7021', KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Functional Status'),
            new AIData('7022', KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Revision Status'),
            new AIData('7023', KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Global Individual Asset Identifier (GIAI) of an Assembly'),
            new AIData('703y', KindOfData::ALPHA_NUMERIC,    3,  30, false, 'Number of Processor with ISO Country Code'),
            new AIData('7040', KindOfData::ALPHA_NUMERIC,    4,  4,  false, 'GS1 UIC with Extension 1 and Importer index'),
            new AIData('710',  KindOfData::ALPHA_NUMERIC,    1,  20, false, 'National Healthcare Reimbursement Number (NHRN) - Germany PZN'),
            new AIData('711',  KindOfData::ALPHA_NUMERIC,    1,  20, false, 'National Healthcare Reimbursement Number (NHRN) - France CIP'),
            new AIData('712',  KindOfData::ALPHA_NUMERIC,    1,  20, false, 'National Healthcare Reimbursement Number (NHRN) - Spain CN'),
            new AIData('713',  KindOfData::ALPHA_NUMERIC,    1,  20, false, 'National Healthcare Reimbursement Number (NHRN) - Brasil DRN'),
            new AIData('714',  KindOfData::ALPHA_NUMERIC,    1,  20, false, 'National Healthcare Reimbursement Number (NHRN) - Portugal AIM'),
            new AIData('723y', KindOfData::ALPHA_NUMERIC,    2,  30, false, 'Certification reference'),
            new AIData('7240', KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Protocol ID'),
            new AIData('8001', KindOfData::NUMERIC,          14, 14, false, 'Roll Products - Width/Length/Core Diameter/Direction/Splices'),
            new AIData('8002', KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Cellular Mobile Telphone Identifier'),
            new AIData('8003', KindOfData::ALPHA_NUMERIC,    15, 30, false, 'Global Returnable Asset Identifier (GRAI)'),
            new AIData('8004', KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Global Individual Asset Identifier (GIAI)'),
            new AIData('8005', KindOfData::NUMERIC,          6,  6,  false, 'Price per Unit of Measure'),
            new AIData('8006', KindOfData::NUMERIC,          18, 18, false, 'Identification of an Individual Trade Item Piece'),
            new AIData('8007', KindOfData::ALPHA_NUMERIC,    1,  34, false, 'International Bank Account Number (IBAN)'),
            new AIData('8008', KindOfData::DATETIME,         8,  12, false, 'Date and Time of Production'),
            new AIData('8009', KindOfData::ALPHA_NUMERIC,    1,  50, false, 'Optically Readable Sensor Indicator'),
            new AIData('8010', KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Component/Part Identifier (CPID)'),
            new AIData('8011', KindOfData::NUMERIC,          1,  12, false, 'Component/Part Identifier Serial Number (CPID Serial)'),
            new AIData('8012', KindOfData::ALPHA_NUMERIC,    1,  20, false, 'Software Version'),
            new AIData('8013', KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Global Model Number (GMN)'),
            new AIData('8017', KindOfData::NUMERIC,          18, 18, false, 'Global Service Relation Number to Identify the Relationship Between an Organisation Offering Services and the Provider of Services'),
            new AIData('8018', KindOfData::NUMERIC,          18, 18, false, 'Global Service Relation Number to Identify the Relationship Between an Organisation Offering Services and the Recipient of Services'),
            new AIData('8019', KindOfData::NUMERIC,          1,  10, false, 'Service Relation Instance Number (SRIN)'),
            new AIData('8020', KindOfData::ALPHA_NUMERIC,    1,  25, false, 'Payment Slip Reference Number'),
            new AIData('8026', KindOfData::NUMERIC,          18, 18, false, 'Identification of pieces of a trade item (ITIP) contained in a logistic unit'),
            new AIData('8110', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Coupon Code Identification for Use in North America'),
            new AIData('8111', KindOfData::NUMERIC,          4,  4,  false, 'Loyalty Points of a Coupon'),
            new AIData('8112', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Paperless Coupon Code Identification for Use in North America (AI 8112)'),
            new AIData('8200', KindOfData::ALPHA_NUMERIC,    1,  70, false, 'Extended Packaging URL'),
            new AIData('90',   KindOfData::ALPHA_NUMERIC,    1,  30, false, 'Information Mutually Agreed Between Trading Partners'),
            new AIData('91',   KindOfData::ALPHA_NUMERIC,    1,  90, false, 'Internal Company Codes'),
            new AIData('92',   KindOfData::ALPHA_NUMERIC,    1,  90, false, 'Internal Company Codes'),
            new AIData('93',   KindOfData::ALPHA_NUMERIC,    1,  90, false, 'Internal Company Codes'),
            new AIData('94',   KindOfData::ALPHA_NUMERIC,    1,  90, false, 'Internal Company Codes'),
            new AIData('95',   KindOfData::ALPHA_NUMERIC,    1,  90, false, 'Internal Company Codes'),
            new AIData('96',   KindOfData::ALPHA_NUMERIC,    1,  90, false, 'Internal Company Codes'),
            new AIData('97',   KindOfData::ALPHA_NUMERIC,    1,  90, false, 'Internal Company Codes'),
            new AIData('98',   KindOfData::ALPHA_NUMERIC,    1,  90, false, 'Internal Company Codes'),
            new AIData('99',   KindOfData::ALPHA_NUMERIC,    1,  90, false, 'Internal Company Codes')
        );
    }
}
