import * as yup from 'yup';
import { emailErrorMsg, reqErrorMsg } from 'utils';
import { ApiCategory, ApiEmailGroup } from 'api/types';

export const wizardStepDetails = [
  {
    title: 'Basic Details',
  },
  {
    title: 'API Schema(s)',
  },
  {
    title: 'Review',
  },
];

export const GET_USERS_QUERY = /* GraphQL */ `
  query ($search: String!) {
    searchRoverUsers(ldapfield: uid, value: $search) {
      mail
      cn
      rhatUUID
    }
  }
`;

export const GET_API_SCHEMA_FILE = /* GraphQL */ `
  query FetchAPISchema($config: FetchApiSchemaInput, $envSlug: String) {
    fetchAPISchema(config: $config, envSlug: $envSlug) {
      schema {
        name
        id
      }
      file
    }
  }
`;

const step1Schema = {
  id: yup.string().notRequired(),
  name: yup.string().trim().required(reqErrorMsg('Name')),
  description: yup.string().trim().required(reqErrorMsg('Description')),
  slug: yup.string().notRequired(),
  owners: yup
    .array(
      yup
        .object({
          group: yup.mixed<ApiEmailGroup>().oneOf(Object.values(ApiEmailGroup)).required(),
          mid: yup
            .string()
            .when('group', {
              is: (value: string) => value === ApiEmailGroup.MAILING_LIST,
              then: yup.string().email(emailErrorMsg(`Owner's mailing list`)).trim().required(),
              otherwise: yup.string().trim().required(),
            })
            .required(reqErrorMsg('Mid')),
          email: yup.string().trim().required(),
        })
        .required(reqErrorMsg('Owners'))
    )
    .required(reqErrorMsg('Owners'))
    .min(1, 'Minimum one owner required'),
};

const step2Schema = {
  schemas: yup
    .array(
      yup
        .object({
          id: yup.string().notRequired(),
          name: yup.string().trim().required(reqErrorMsg('Schema name')),
          description: yup.string().trim().required(reqErrorMsg('Schema description')),
          appURL: yup.string().url().trim().required(reqErrorMsg('Application URL')),
          docURL: yup.string().url().trim(),
          flags: yup.object({
            isInternal: yup.bool().default(false),
            isDeprecated: yup.bool().default(false),
          }),
          category: yup
            .mixed<ApiCategory>()
            .oneOf(Object.values(ApiCategory))
            .required(reqErrorMsg('API Category')),
          environments: yup
            .array(
              yup.object({
                id: yup.string().notRequired(),
                name: yup.string().trim().required(reqErrorMsg('Name')),
                slug: yup.string().notRequired(),
                apiBasePath: yup.string().url().trim().required(reqErrorMsg('API Base Path')),
                schemaEndpoint: yup.string().url().trim(),
                headers: yup.array(
                  yup.object({
                    id: yup.string().notRequired(),
                    key: yup.string().trim(),
                    value: yup.string().trim(),
                  })
                ),
                isPublic: yup.bool(),
              })
            )
            .required(reqErrorMsg('Environments')),
        })
        .required(reqErrorMsg('Schema'))
    )
    .min(1)
    .required(reqErrorMsg('Schema')),
};

export const wizardValidationSchemas = {
  1: yup.object(step1Schema),
  2: yup.object(step2Schema),
  3: yup.object({ ...step1Schema, ...step2Schema }),
};