import 'babel-polyfill';
import axios from "axios";

export default class API {

    constructor() {
        this.loggedIn = false;
        this.user = { };
    }

    csrfToken() {
        return this.loggedIn ? this.user.session.csrf_token : null;
    }

    async apiCall(method, params) {
        params = params || { };
        const csrf_token = this.csrfToken();
        if (csrf_token) params.csrf_token = csrf_token;
        let response = await axios.post("/api/" + method, params);
        return response.data;
    }

    async fetchUser() {
        let response = await axios.get("/api/user/info");
        let data = response.data;
        this.user = data["user"];
        this.loggedIn = data["loggedIn"];
        return data && data["success"] && data["loggedIn"];
    }

    async logout() {
        return this.apiCall("user/logout");
    }

    validateToken(token) {
        return this.apiCall("file/validateToken", { token: token });
    }

    listFiles() {
        return this.apiCall("file/listFiles");
    }

    listTokens() {
        return this.apiCall("file/listTokens");
    }

    delete(id, token=null) {
        return this.apiCall("file/delete", { id: id, token: token });
    }

    revokeToken(token) {
        return this.apiCall("file/revokeToken", { token: token });
    }

    createDownloadToken(durability, files) {
        return this.apiCall("file/createDownloadToken", { files: files, durability: durability });
    }

    createUploadToken(durability, parentId=null, maxFiles=0, maxSize=0, extensions = "") {
        return this.apiCall("file/createUploadToken", { parentId: parentId, durability: durability, maxFiles: maxFiles, maxSize: maxSize, extensions: extensions });
    }

    createDirectory(name, parentId = null) {
        return this.apiCall("file/createDirectory", { name: name, parentId: parentId });
    }

    moveFiles(files, parentId = null) {
        return this.apiCall("file/move", { id: files, parentId: parentId });
    }

    rename(id, name, token = null) {
        return this.apiCall("file/rename", { id: id, name: name, token: token });
    }

    getRestrictions() {
        return this.apiCall("file/getRestrictions");
    }

    async upload(file, token = null, parentId = null, cancelToken = null, onUploadProgress = null) {
        const csrf_token = this.csrfToken();

        const fd = new FormData();
        fd.append("file", file);
        if (csrf_token) fd.append("csrf_token", csrf_token);
        if (token) fd.append("token", token);
        if (parentId) fd.append("parentId", parentId);

        let response = await axios.post('/api/file/upload', fd, {
            headers: { 'Content-Type': 'multipart/form-data' },
            onUploadProgress: onUploadProgress || function () { },
            cancelToken : cancelToken.token
        });

        return response.data;
    }
};