/*
 * Copyright (c) 2022.
 * Author Peter Placzek (tada5hi)
 * For the full copyright and license information,
 * view the LICENSE file that was distributed with this source code.
 */

import {CollectionResponseType, ResourceResponseType} from "@/modules/api/type";
import {AuthUser} from "@chamesu/common/domains/auth/user";
import {AuthUserImageType} from "@chamesu/common/domains/auth/user/type";
import {useApi} from "~/modules/api";
import {formatRequestRecord, RequestRecord} from "~/modules/api/utils";

export async function getUsers<T extends CollectionResponseType<AuthUser>>(options?: RequestRecord) : Promise<T> {
    const { data: response } = await useApi('auth').get<T>('auth/users' + formatRequestRecord(options));

    return response;
}

export async function getUser<T extends ResourceResponseType<AuthUser>>(id: number) : Promise<T> {
    const { data: response } = await useApi('auth').get<T>('auth/users/'+id);

    return response;
}

export async function dropUser<T extends ResourceResponseType<AuthUser>>(id: number) : Promise<T>  {
    const { data: response } = await useApi('auth').delete<T>('auth/users/'+id);

    return response;
}

export async function addUser<T extends ResourceResponseType<AuthUser>>(data: {[key: string] : any}) : Promise<T>  {
    const { data: response } = await useApi('auth').post<T>('auth/users',data);

    return response;
}

export async function editUser<T extends ResourceResponseType<AuthUser>>(userId: number, data: {[key: string] : any}) : Promise<T>  {
    const { data: response } = await useApi('auth').post<T>('auth/users/'+userId, data);

    return response;
}

export async function editUserImage<T extends ResourceResponseType<AuthUser>>(
    userId: number,
    type: AuthUserImageType,
    image: string | Blob,
    data: {
        coordinates: Record<string, any>,
        visibleArea: Record<string, any>
    }
) : Promise<T> {
    const formData = new FormData();
    formData.append(type, image);

    for(let key in data) {
        for(let keySecond in data[key]) {
            if(!data[key].hasOwnProperty(keySecond)) continue;
            formData.append(key+keySecond.charAt(0).toUpperCase() + keySecond.substr(1), data[key][keySecond]);
        }
    }

    const { data: response } = await useApi('auth').post<T>('auth/users/'+userId, formData, {
        headers: {
            'Content-Type': 'multipart/form-data'
        }
    });

    return response;
}
