import parseDocumentCode from '../parsers/parseDocumentCodeId.ts';
import { parseDocumentNumberOptional } from '../parsers/parseDocumentNumberOptional.ts';
import { parseOptional } from '../parsers/parseOptional.ts';

import type { FieldOptions } from './createFieldParser.ts';
import createFieldParser from './createFieldParser.ts';
import {
  birthDateCheckDigitTemplate,
  birthDateTemplate,
  compositeCheckDigitTemplate,
  documentCodeTemplate,
  documentNumberCheckDigitTemplate,
  documentNumberTemplate,
  expirationDateCheckDigitTemplate,
  expirationDateTemplate,
  firstNameTemplate,
  issuingStateTemplate,
  lastNameTemplate,
  nationalityTemplate,
  sexTemplate,
} from './fieldTemplates.ts';

const fields: FieldOptions[] = [
  {
    ...documentCodeTemplate,
    line: 0,
    start: 0,
    end: 2,
    parser: parseDocumentCode,
  },
  { ...issuingStateTemplate, line: 0, start: 2, end: 5 },
  {
    ...documentNumberTemplate,
    line: 0,
    start: 5,
    end: 14,
    related: [
      {
        line: 0,
        start: 14,
        end: 15,
      },
      {
        line: 0,
        start: 15,
        end: 30,
      },
    ],
  },
  {
    ...documentNumberCheckDigitTemplate,
    line: 0,
    start: 14,
    end: 15,
    related: [
      {
        line: 0,
        start: 5,
        end: 14,
      },
      {
        line: 0,
        start: 15,
        end: 30,
      },
    ],
  },
  {
    label: 'Optional field 1',
    field: 'optional1',
    line: 0,
    start: 15,
    end: 30,
    related: [],
    parser: parseDocumentNumberOptional,
  },
  { ...birthDateTemplate, start: 0, end: 6, line: 1 },
  {
    ...birthDateCheckDigitTemplate,
    line: 1,
    start: 6,
    end: 7,
    related: [
      {
        line: 1,
        start: 0,
        end: 6,
      },
    ],
  },
  { ...sexTemplate, line: 1, start: 7, end: 8 },
  { ...expirationDateTemplate, line: 1, start: 8, end: 14 },
  {
    ...expirationDateCheckDigitTemplate,
    line: 1,
    start: 14,
    end: 15,
    related: [
      {
        line: 1,
        start: 8,
        end: 14,
      },
    ],
  },
  { ...nationalityTemplate, line: 1, start: 15, end: 18 },
  {
    label: 'Optional field 2',
    field: 'optional2',
    line: 1,
    start: 18,
    end: 29,
    parser: parseOptional,
  },
  {
    ...compositeCheckDigitTemplate,
    line: 1,
    start: 29,
    end: 30,
    related: [
      {
        line: 0,
        start: 5,
        end: 30,
      },
      {
        line: 1,
        start: 0,
        end: 7,
      },
      {
        line: 1,
        start: 8,
        end: 15,
      },
      {
        line: 1,
        start: 18,
        end: 29,
      },
    ],
  },
  { ...lastNameTemplate, line: 2, start: 0, end: 30 },
  { ...firstNameTemplate, line: 2, start: 0, end: 30 },
];

export default fields.map(createFieldParser);
