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

import {
    DocumentSummary,
    PersonalInformationDocument,
    PersonalInformationDocumentType,
    personalInformationDocumentTypeSchema,
} from './types';

const schema = z.object({
    userId: z.string().trim().nonempty().guid(),
    types: z.array(personalInformationDocumentTypeSchema).min(0).optional(),
});

export const getUserDocuments = async (
    client: Client,
    userId: string,
    types?: PersonalInformationDocumentType[] // optional parameter
): Promise<DocumentSummary> => {
    const result = schema.safeParse({ userId, types });
    if (!result.success) {
        throw new TypeError('Invalid args', {
            cause: result.error.issues,
        });
    }

    const docSumary: DocumentSummary = await client
        .get<DocumentSummary>(`/boapi/proxy/user/fleets/${client.clientOptions.fleetId}/users/${userId}/documents`)
        .then(({ data }) => data);

    if (docSumary && docSumary.documents?.length > 0 && result.data.types && result.data.types.length > 0) {
        const piTypes = result.data.types.join(',');
        docSumary.documents = await Promise.all(
            docSumary.documents.map(async (doc) => {
                const pi: PersonalInformationDocument = await client
                    .get<PersonalInformationDocument>(
                        `/boapi/proxy/user/fleets/${client.clientOptions.fleetId}/users/${userId}/documents/${doc.id}/pi?types=${piTypes}`
                    )
                    .then(({ data }) => data);

                if (pi?.documentNumber1) {
                    return {
                        ...doc, // Copy the original
                        documentNumber: pi.documentNumber1, // update the documentNumber field
                    };
                }
                return doc;
            })
        );
    }

    return docSumary;
};
