import { ApplicaDataProvider } from '../provider';
import { createAttachmentsParser } from '../utils';
import { MemoryStorage, createAuthProvider } from '@applica-software-guru/iam-client';
import { IApplicaAuthProvider } from '@applica-software-guru/iam-client/dist/types';
import { HttpError } from 'ra-core';

const CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

const API_URL = 'http://localhost:8080/api';
const PASSWORD = 'applica';

const USERNAME = 'admin@applica.guru';

function createProviders(): {
  dataProvider: ApplicaDataProvider;
  authProvider: IApplicaAuthProvider;
} {
  const storage = new MemoryStorage();
  const authProvider = createAuthProvider({ apiUrl: API_URL, storage });
  const dataProvider = new ApplicaDataProvider({
    apiUrl: API_URL,
    HttpErrorClass: HttpError,
    getHeaders: async () => await authProvider.getHeaders(),
    getToken: async () => await authProvider.getToken(),
    attachmentsParser: createAttachmentsParser()
  });

  return {
    dataProvider,
    authProvider
  };
}

function createRandomString(length: number): string {
  return Array(length)
    .fill(0)
    .map(() => CHARS.charAt(Math.floor(Math.random() * CHARS.length)))
    .join('');
}

export { API_URL, PASSWORD, USERNAME, createProviders, createRandomString };
