import { describe, test, expect, vi, beforeEach, afterEach } from 'vitest';
import { Client } from '@vulog/aima-client';
import { getUserById } from './getUserById';

describe('getUser', () => {
    const FLEET_ID = 'FLEET_ID';
    const USER_ID = '018ab2b6-71b2-4c76-90bd-6e8d3f268618';
    const getMock = vi.fn();
    const client = {
        get: getMock,
        clientOptions: {
            fleetId: FLEET_ID,
        },
    } as unknown as Client;

    beforeEach(() => {
        getMock.mockReset();
        vi.useFakeTimers({ now: new Date('2025-01-12T13:35:50.123Z') });
    });

    afterEach(() => {
        vi.useRealTimers();
    });

    test('call OK', async () => {
        const data = {
            id: USER_ID,
            lastName: 'DOE',
            firstName: 'John',
            middleName: '',
            gender: 'MALE',
            locale: 'en_GB',
            address: {
                streetName: 'Rue Emmanuel Grout',
                city: 'Nice',
                postalCode: '06200',
                region: null,
                country: 'France',
                number: '42',
                addressAdditionalInformation: 'bat A',
            },
            dataPrivacyConsent: true,
            marketingConsent: true,
            agreements: [
                {
                    fleetId: 'PFSDE-DESTR',
                    cityId: 'a91a8d56-4bf8-4a88-9afb-3f3cc255e4f8',
                    userId: USER_ID,
                    date: '2024-02-05T16:10:27Z',
                    hasAcceptedLatest: true,
                },
            ],
            profiles: [
                {
                    id: '61bdc58e-a6d0-4f6a-b9bd-727b17ead122',
                    rfid: null,
                    email: 'jdoe@vulog.com',
                    phoneNumber: '+49555555',
                    creationDate: '2024-02-05T16:10:27.000Z',
                    updateDate: null,
                    entityId: 'b2e6c45e-896b-44ce-aa25-92ecd5349523',
                    entityName: 'default',
                    fiscalCode: null,
                    status: 'APPROVED',
                    name: 'default',
                    type: 'Single',
                    emailConsent: true,
                    services: [
                        {
                            id: '809614e1-6406-4a58-9c7e-1b2ac8df87ea',
                            name: 'Vulog srv1',
                            status: 'SERVICE_REG_UNREGISTERED',
                            cityId: 'a91a8d56-4bf8-4a88-9afb-3f3cc255e4f8',
                            visibility: 'PUBLIC',
                        },
                        {
                            id: '3ef72482-94c1-40c0-a467-abffaef03d45',
                            name: 'Vulog srv2',
                            status: 'APPROVED',
                            cityId: 'a91a8d56-4bf8-4a88-9afb-3f3cc255e4f8',
                            visibility: 'PUBLIC',
                        },
                    ],
                    financialInformation: null,
                    billingInProgress: null,
                },
            ],
            membershipNumber: '',
            profilingConsent: true,
            profilingConsentUpdateDate: '2024-02-05T16:10:27.000Z',
            userIndividualBusiness: {
                companyName: 'my Corp',
                vat: 'FR123456789',
                number: '123',
                streetName: 'Bd. Marie Curie',
                addressAdditionalInformation: 'Bat. A',
                city: 'Nice',
                postalCode: '06200',
                country: 'FR',
                fleetId: FLEET_ID,
                userId: USER_ID,
            },
        };
        getMock.mockResolvedValueOnce({
            data: data,
        });

        const user = await getUserById(client, USER_ID);
        expect(getMock).toBeCalled();
        expect(getMock).toBeCalledWith(`/boapi/proxy/user/fleets/${FLEET_ID}/users/${USER_ID}/status`);
        expect(user).toBeTruthy();
        expect(user.id).toEqual(data.id);
        expect(user.locale).toEqual(data.locale);
        expect(user.dataPrivacyConsent).toEqual(data.dataPrivacyConsent);
        expect(user.marketingConsent).toEqual(data.marketingConsent);
        expect(user.agreements).toBeTruthy();
        expect(user.agreements.length).toEqual(data.agreements.length);
        expect(user.agreements[0].cityId).toEqual(data.agreements[0].cityId);
        expect(user.agreements[0].date).toEqual(data.agreements[0].date);
        expect(user.agreements[0].hasAcceptedLatest).toEqual(data.agreements[0].hasAcceptedLatest);
        expect(user.profiles).toBeTruthy();
        expect(user.profiles.length).toEqual(data.profiles.length);
        expect(user.profiles[0].id).toEqual(data.profiles[0].id);
        expect(user.profiles[0].rfid).toEqual(data.profiles[0].rfid);
        expect(user.profiles[0].creationDate).toEqual(data.profiles[0].creationDate);
        expect(user.profiles[0].updateDate).toEqual(data.profiles[0].updateDate);
        expect(user.profiles[0].entityId).toEqual(data.profiles[0].entityId);
        expect(user.profiles[0].entityName).toEqual(data.profiles[0].entityName);
        expect(user.profiles[0].status).toEqual(data.profiles[0].status);
        expect(user.profiles[0].type).toEqual(data.profiles[0].type);
        expect(user.profiles[0].emailConsent).toEqual(data.profiles[0].emailConsent);
        expect(user.surveyConsent).toBeFalsy(); // because not retuned
        expect(user.shareDataConsent).toBeFalsy(); // because not retuned
        expect(user.surveyConsentUpdateDate).toBeFalsy(); // because not retuned
        expect(user.shareDataConsentUpdateDate).toBeFalsy(); // because not retuned
        expect(user.profilingConsent).toEqual(data.profilingConsent);
        expect(user.profilingConsentUpdateDate).toEqual(data.profilingConsentUpdateDate);
    });
});
