/* global FormData */

import { BaseModel } from './base'
import { Record } from 'immutable'
import axios from 'axios'

const DatasetRecord = Record({
  id: 0,
  name: '',
  episodeSize: 0,
  stepSize: 0,
  dataSize: 0,
  isImage: false,
  isDiscrete: false,
  statistics: {},
  createdAt: '',
  updatedAt: ''
})

const urlBase = '/api/datasets'

export class Dataset extends BaseModel(DatasetRecord, urlBase, 'dataset') {
  static upload (file, isImage, zipFile, progressCallback) {
    const params = new FormData()
    params.append('dataset', file)
    params.append('is_image', isImage)
    if (isImage) {
      params.append('zip_file', zipFile)
    }
    const config = {
      headers: { 'Content-type': 'multipart/form-data' },
      onUploadProgress: progressCallback
    }
    return new Promise((resolve, reject) => {
      axios.post('/api/datasets/upload', params, config)
        .then((res) => {
          const dataset = Dataset.fromResponse(res.data)
          resolve(dataset)
          return dataset
        })
        .catch((err) => reject(err))
    })
  }

  getExampleObservations () {
    return new Promise((resolve, reject) => {
      axios.get(`/api/datasets/${this.id}/example`)
        .then((res) => {
          const { observations } = res.data
          resolve(observations)
          return observations
        })
        .catch((err) => reject(err))
    })
  }

  static fromResponse (data) {
    const dataset = new Dataset({
      id: data.id,
      name: data.name,
      episodeSize: data.episode_size,
      stepSize: data.step_size,
      dataSize: data.data_size,
      isImage: data.is_image,
      isDiscrete: data.is_discrete,
      statistics: JSON.parse(data.statistics),
      createdAt: data.created_at,
      updatedAt: data.updated_at
    })
    return dataset
  }

  toRequest () {
    return {
      id: this.id,
      name: this.name
    }
  }
}