import { InputTypings } from '../src/parser/types_parser';
import { ExampleZoneFile, ExampleDomain } from '../example/example_types';
import {
  getErrorText,
  importZoneAdapter,
  clientServiceApi,
  createRecordValidator,
} from '../example/example_consumer';
import { Validator } from '../src';
import { Parser } from '../src/parser/parser';

export const parse = (text: string, $originName?: string) =>
  new Parser($originName).setText(text).parse();

export const validate = (parser: Parser) =>
  new Validator({ getErrorText }).validate(parser);

export const mergeMultipleSpaces = (x: string): string => x.replace(/\s+/, ' ');

export const spyOnCreateApi = () =>
  jest.spyOn(clientServiceApi, 'createRecords');

export type MockSupportedRecordType =
  | InputTypings.SupportedRecordType
  | 'GENERAL'
  | 'SOA';

export const hz = {
  name: 'igloo.com.',
};

export const fromApiRecordToClientRecord = (
  record: ExampleDomain.ApiRecord
): ExampleDomain.ClientRecord => ({
  name: record.recordName,
  endpoints: record.routeTrafficToEndpoints,
  type: record.recordType,
  ttl: ['string', 'number'].includes(typeof record.ttl) ? +record.ttl : 0,
});

export const testParseAdaptAndValidate = (
  txt: string,
  hz: ExampleDomain.HostedZone
) => {
  const parser = parse(txt, hz?.name);
  const { records, warnings } = importZoneAdapter(parser, hz);
  const { errors } = new Validator({
    getErrorText,
    postValidators: [createRecordValidator(records)],
  }).validate(parser);

  return { errors, warnings, records, parser };
};

export const testImportZoneFile = (
  txt: string
): ExampleZoneFile.ParsedAndValidated => {
  const { parser, records, warnings, errors } = testParseAdaptAndValidate(
    txt,
    hz
  );

  return {
    records: records.map(fromApiRecordToClientRecord),
    error: errors[0],
    warnings,
    parser,
  };
};

export const testImportZoneFileAndCallApi = (txt: string) => {
  const { records } = testParseAdaptAndValidate(txt, hz);

  return clientServiceApi.createRecords(hz, records);
};
