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

import z from 'zod';

import type { Credit } from './types';

interface Payload
    extends Omit<Credit, 'id' | 'availableAmount' | 'usedAmount' | 'originId' | 'creditAlreadyUsed' | 'updateDate'> {}

const schema = z.object({
    initialAmount: z.number().min(0),
    validityStartDate: z.string().datetime(),
    validityEndDate: z.string().datetime(),
    notes: z.string().trim().nullable().optional(),
    discountCategory: z.enum(['CREDITS', 'PERCENTAGE']),
    oneTimeUsage: z.boolean().optional(),
    entityId: z.string().trim().min(1).uuid(),
    type: z.enum(['LOCAL', 'GLOBAL', 'PERIODIC']),
    usage: z.enum(['TRIP', 'REGISTRATION', 'PRODUCTS', 'ALL']),
});

export const addCredits = async (client: Client, payload: Payload): Promise<Credit> => {
    const result = schema.safeParse(payload);
    if (!result.success) {
        throw new TypeError('Invalid args', {
            cause: result.error.issues,
        });
    }

    return client
        .post<Credit>(
            `/boapi/proxy/billing/fleets/${client.clientOptions.fleetId}/entities/${payload.entityId}/wallets`,
            result.data
        )
        .then(({ data }) => data);
};
