import parseDocumentCode from '../parsers/parseDocumentCodeId.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 },
  { ...lastNameTemplate, line: 0, start: 5, end: 36 },
  { ...firstNameTemplate, line: 0, start: 5, end: 36 },
  {
    ...documentNumberTemplate,
    line: 1,
    start: 0,
    end: 9,
    related: [
      {
        line: 1,
        start: 9,
        end: 10,
      },
      {
        line: 1,
        start: 28,
        end: 35,
      },
    ],
  },
  {
    ...documentNumberCheckDigitTemplate,
    line: 1,
    start: 9,
    end: 10,
    related: [
      {
        line: 1,
        start: 0,
        end: 9,
      },
      {
        line: 1,
        start: 28,
        end: 35,
      },
    ],
  },
  { ...nationalityTemplate, line: 1, start: 10, end: 13 },
  { ...birthDateTemplate, line: 1, start: 13, end: 19 },
  {
    ...birthDateCheckDigitTemplate,
    line: 1,
    start: 19,
    end: 20,
    related: [
      {
        line: 1,
        start: 13,
        end: 19,
      },
    ],
  },
  { ...sexTemplate, line: 1, start: 20, end: 21 },
  { ...expirationDateTemplate, line: 1, start: 21, end: 27 },
  {
    ...expirationDateCheckDigitTemplate,
    line: 1,
    start: 27,
    end: 28,
    related: [
      {
        line: 1,
        start: 21,
        end: 27,
      },
    ],
  },
  {
    label: 'Optional field',
    field: 'optional',
    line: 1,
    start: 28,
    end: 35,
    parser: parseOptional,
  },
  {
    ...compositeCheckDigitTemplate,
    line: 1,
    start: 35,
    end: 36,
    related: [
      {
        line: 1,
        start: 0,
        end: 10,
      },
      {
        line: 1,
        start: 13,
        end: 20,
      },
      {
        line: 1,
        start: 21,
        end: 35,
      },
    ],
  },
];

export default fields.map(createFieldParser);
