import type { BuiltInCreditCardType, CardCollection } from "../types";

const cardTypes: CardCollection = {
  visa: {
    niceType: "Visa",
    type: "visa",
    patterns: [4],
    gaps: [4, 8, 12],
    lengths: [16, 18, 19],
    code: {
      name: "CVV",
      size: 3,
    },
  } as BuiltInCreditCardType,
  mastercard: {
    niceType: "Mastercard",
    type: "mastercard",
    patterns: [[51, 55], [2221, 2229], [223, 229], [23, 26], [270, 271], 2720],
    gaps: [4, 8, 12],
    lengths: [16],
    code: {
      name: "CVC",
      size: 3,
    },
  } as BuiltInCreditCardType,
  "american-express": {
    niceType: "American Express",
    type: "american-express",
    patterns: [34, 37],
    gaps: [4, 10],
    lengths: [15],
    code: {
      name: "CID",
      size: 4,
    },
  } as BuiltInCreditCardType,
  "diners-club": {
    niceType: "Diners Club",
    type: "diners-club",
    patterns: [[300, 305], 36, 38, 39],
    gaps: [4, 10],
    lengths: [14, 16, 19],
    code: {
      name: "CVV",
      size: 3,
    },
  } as BuiltInCreditCardType,
  troy: {
    niceType: "Troy",
    type: "troy",
    patterns: [
      9792,
      650052,
      [650082, 650083],
      650092,
      650161,
      650170,
      650173,
      650175,
      650268,
      650271,
      [650273, 650274],
      [650456, 650457],
      650836,
      [650846, 650850],
      650923,
      650987,
      650990,
      654997,
      657366,
      657998,
      658758,
      [658767, 658768],
      [65083700, 65083704],
      [65085800, 65085804],
      [65085900, 65085901],
      65086000,
      [65086100, 65086105],
      [65086200, 65086203],
      [65875000, 65875003],
      65875009,
      [65875101, 65875104],
      65875200,
      65875501,
      65875601,
      65875900,
      [65876000, 65876002],
      [65876100, 65876103],
      65876110,
      [65876115, 65876116],
      [65876200, 65876201],
      65876500,
      [65876504, 65876505],
      [65876600, 65876602],
      [65877100, 65877101],
      [65877600, 65877602],
      65877700,
      [65877801, 65877802],
      [65878200, 65878202],
      [65878300, 65878311],
      [65878400, 65878405],
      [65878500, 65878505],
      [65878600, 65878601],
      65879800,
      65880800,
      65880900,
    ],
    gaps: [4, 8, 12],
    lengths: [16],
    code: {
      name: "CVV",
      size: 3,
    },
  } as BuiltInCreditCardType,
  discover: {
    niceType: "Discover",
    type: "discover",
    patterns: [6011, [644, 649], 65],
    gaps: [4, 8, 12],
    lengths: [16, 19],
    code: {
      name: "CID",
      size: 3,
    },
  } as BuiltInCreditCardType,
  jcb: {
    niceType: "JCB",
    type: "jcb",
    patterns: [2131, 1800, [3528, 3589]],
    gaps: [4, 8, 12],
    lengths: [16, 17, 18, 19],
    code: {
      name: "CVV",
      size: 3,
    },
  } as BuiltInCreditCardType,
  unionpay: {
    niceType: "UnionPay",
    type: "unionpay",
    patterns: [
      620,
      [62100, 62182],
      [62184, 62187],
      [62185, 62197],
      [62200, 62205],
      [622010, 622999],
      622018,
      [62207, 62209],
      [623, 626],
      6270,
      6272,
      6276,
      [627700, 627779],
      [627781, 627799],
      [6282, 6289],
      6291,
      6292,
      810,
      [8110, 8131],
      [8132, 8151],
      [8152, 8163],
      [8164, 8171],
    ],
    gaps: [4, 8, 12],
    lengths: [14, 15, 16, 17, 18, 19],
    code: {
      name: "CVN",
      size: 3,
    },
  } as BuiltInCreditCardType,
  maestro: {
    niceType: "Maestro",
    type: "maestro",
    patterns: [
      493698,
      [500000, 504174],
      [504176, 506698],
      [506779, 508999],
      [56, 59],
      63,
      67,
      6,
    ],
    gaps: [4, 8, 12],
    lengths: [12, 13, 14, 15, 16, 17, 18, 19],
    code: {
      name: "CVC",
      size: 3,
    },
  } as BuiltInCreditCardType,
  elo: {
    niceType: "Elo",
    type: "elo",
    patterns: [
      401178,
      401179,
      438935,
      457631,
      457632,
      431274,
      451416,
      457393,
      504175,
      [506699, 506778],
      [509000, 509999],
      627780,
      636297,
      636368,
      [650031, 650033],
      [650035, 650051],
      [650405, 650439],
      [650485, 650538],
      [650541, 650598],
      [650700, 650718],
      [650720, 650727],
      [650901, 650978],
      [651652, 651679],
      [655000, 655019],
      [655021, 655058],
    ],
    gaps: [4, 8, 12],
    lengths: [16],
    code: {
      name: "CVE",
      size: 3,
    },
  } as BuiltInCreditCardType,
  mir: {
    niceType: "Mir",
    type: "mir",
    patterns: [[2200, 2204]],
    gaps: [4, 8, 12],
    lengths: [16, 17, 18, 19],
    code: {
      name: "CVP2",
      size: 3,
    },
  } as BuiltInCreditCardType,
  hiper: {
    niceType: "Hiper",
    type: "hiper",
    patterns: [637095, 63737423, 63743358, 637568, 637599, 637609, 637612],
    gaps: [4, 8, 12],
    lengths: [16],
    code: {
      name: "CVC",
      size: 3,
    },
  } as BuiltInCreditCardType,
  hipercard: {
    niceType: "Hipercard",
    type: "hipercard",
    patterns: [606282],
    gaps: [4, 8, 12],
    lengths: [16],
    code: {
      name: "CVC",
      size: 3,
    },
  } as BuiltInCreditCardType,
  naranja: {
    niceType: "Naranja",
    type: "naranja",
    patterns: [589562, 402918, 527572],
    gaps: [4, 8, 12],
    lengths: [16],
    code: {
      name: "CVV",
      size: 3,
    },
  } as BuiltInCreditCardType,
  verve: {
    niceType: "Verve",
    type: "verve",
    patterns: [
      [506099, 506127],
      506129,
      [506133, 506150],
      [506158, 506163],
      506166,
      506168,
      506170,
      506173,
      [506176, 506180],
      506184,
      [506187, 506188],
      506191,
      506195,
      506197,
      507865,
      507866,
      [507868, 507877],
      [507880, 507888],
      507900,
      507941,
    ],
    gaps: [4, 8, 12],
    lengths: [16, 18, 19],
    code: {
      name: "CVV",
      size: 3,
    },
  } as BuiltInCreditCardType,
};

export = cardTypes;
