import { Client } from '@vulog/aima-client';
import { z } from 'zod';

import { User } from './types';

export type CreateUser = {
    userName: string;
    password: string;
    locale: string;
    email: string;
    dataPrivacyConsent?: boolean;
    profilingConsent?: boolean;
    marketingConsent?: boolean;
};

export type CreateUserOptions = {
    tcApproval?: boolean;
    skipUserNotification?: boolean;
};

const createUserSchema = z.object({
    userName: z.string().min(1),
    password: z.string().min(1),
    locale: z.string().length(5),
    email: z.string().min(1).email(),
    dataPrivacyConsent: z.boolean().optional(),
    profilingConsent: z.boolean().optional(),
    marketingConsent: z.boolean().optional(),
});

const createUserOptionsSchema = z
    .object({
        tcApproval: z.boolean().default(true),
        skipUserNotification: z.boolean().default(false),
    })
    .default({
        tcApproval: true,
        skipUserNotification: false,
    });

export const createUser = async (client: Client, user: CreateUser, option?: CreateUserOptions): Promise<User> => {
    const resultUser = createUserSchema.safeParse(user);
    if (!resultUser.success) {
        throw new TypeError('Invalid user', {
            cause: resultUser.error.issues,
        });
    }
    const resultOptions = createUserOptionsSchema.safeParse(option);
    if (!resultOptions.success) {
        throw new TypeError('Invalid options', {
            cause: resultOptions.error.issues,
        });
    }

    const searchParams = new URLSearchParams();
    searchParams.append('tcApproval', resultOptions.data.tcApproval.toString());
    searchParams.append('skipUserNotification', resultOptions.data.skipUserNotification.toString());

    return client
        .post(
            `/boapi/proxy/user/fleets/${client.clientOptions.fleetId}/userDefault?${searchParams.toString()}`,
            resultUser.data
        )
        .then(({ data }) => data);
};
