import 'babel-polyfill';




const endPoints = {

    upload: '/api/v1/u',
    session: '/api/v1/session',
    pollupstatus: '/api/v1/u/poll',
    checkstatus: '/api/v1/u/check',
    download: '/api/v1/d/q', // query download
    getFiles: '/api/v1/d/g', // get file
    pollinvoice: '/api/v1/pollinvoice',
    adminToken: '/api/v1/a/info'

}

export function adminInfo(adminToken){

        let req = new Request(endPoints.adminToken + '/' + adminToken,{
            method: 'GET',
            credentials: 'same-origin'
        })
    console.log(req)

    return fetch(req).catch((e)=>{console.error(e)})
}

export async function download(dlId){

        let req = new Request(endPoints.download + '/' + dlId,{
            method: 'GET',
            credentials: 'same-origin'
        })


        return fetch(req).catch((e)=>{console.error(e)})
}

export async function lastSession(){

        let req = new Request(endPoints.session, {
            method: 'GET',
            credentials: 'same-origin'
        })

        let res = await fetch(req)
        .catch((e) => {console.error(e)})


        return res.json()
}

export async function checkUploadStatus(uploadId){
    
        let req = new Request(endPoints.checkstatus + '/' + uploadId,{
            method: 'GET',
            credentials: 'same-origin'
        })


        return fetch(req).catch((e)=>{console.error(e)})
}

export function pollInvoice(invoiceId){
        let req = new Request(endPoints.pollinvoice + '/' + invoiceId,{
            method: 'GET',
            credentials: 'same-origin'
        })


        return fetch(req).catch((e)=>{console.error(e)})
}

export async function pollUploadStatus(uploadId){

        //console.log('polling upload status')

        let req = new Request(endPoints.pollupstatus + '/' + uploadId,{
            method: 'GET',
            credentials: 'same-origin'
        })

        return fetch(req).catch((e)=>{console.error(e)})

}

class Upload {

    constructor(filesMetadata, fileObjects, options) {
        this.filesMetadata = Array.from(filesMetadata)
        this.fileObjects = fileObjects
        this.timestamp = new Date()
        this.options = options
    }

    get uploadMetadata() {

        return {
            files: this.filesMetadata,
            timestamp: this.timestamp,
            ...this.options
        }
    }

    async create()  {
        let req = new Request(endPoints.upload , {
            method: 'POST',
            credentials: 'same-origin',
            body: JSON.stringify(this.uploadMetadata)
        })

        //let result = await fetch(req);
        let res = await fetch(req)
        .catch((e) => { console.error(e) })


        return res.json().then(data => {
            let { upload_id: id  } = data
            this.uploadId = id
            return data
        })
    }

    async checkstatus(){
        return pollUploadStatus(this.uploadId)
    }

    async send(){
        console.log(`Sending with id ${this.uploadId}`)

        let formData = new FormData();
        for (let file of this.fileObjects) {
            formData.append('upload[]', file)
        }


        let req = new Request(endPoints.upload + '/' + this.uploadId, {
            method: 'PUT',
            credentials: 'same-origin',
            body: formData
        })

        let res = await fetch(req)
        .catch((e) => {console.error(e)})

        return res.json()
    }
}

export default {
    endPoints: endPoints,
    Upload: Upload,
    pollUploadStatus: pollUploadStatus,
    checkUploadStatus: checkUploadStatus,
    download: download,
    pollInvoice: pollInvoice,
    adminInfo: adminInfo
}
