import Field from '../Domain/Entity/Field.js'

import FieldMapper from '../Domain/Mapper/FieldMapper.js'

import repoBus from '../../oop-store/repoBus'
import axios from '../../plugins/internal/axios-instance.js'
import MappingHelpers from '../Utility/Static/MappingHelpers.js'

export const FIELD_UPDATED = 'Field updated'
export const FIELD_CREATED = 'Field created'
export const FIELD_REMOVED = 'Field removed'

export default class FieldRepository {
  /**
   * Get all fields with subfields.
   */
  static async getAllFields () {
    const fieldsData = (await axios.get('fields?with_values=1')).data
    return fieldsData.map(FieldMapper.map)
  }

  static async getOne (field: Field): void {
    const fieldData = (await axios.get('fields/' + field.id)).data
    MappingHelpers.fixIds(fieldData)
    return FieldMapper.map(fieldData)
  }

  static async create (field: Field): Field {
    const payload = FieldMapper.transform(field)
    MappingHelpers.unfixIds(payload)
    const createdField = new Field(field)
    createdField.id = (await axios.post('fields', payload)).data
    repoBus.emit(FIELD_CREATED, createdField)
    return createdField
  }

  static async update (field: Field): Field {
    const payload = FieldMapper.transform(field)
    MappingHelpers.unfixIds(payload)
    const updatedField = new Field(field)
    await axios.put(`fields/${field.id}`, payload)
    repoBus.emit(FIELD_UPDATED, updatedField)
    return updatedField
  }

  static async getManyWithQuery (params: Object): Field[] {
    const data = (await axios.get(`fields`, { params })).data
    return data.map(FieldMapper.map)
  }

  static async remove (field: Field): void {
    await axios.delete(`fields/${field.id}`)
    repoBus.emit(FIELD_REMOVED, field)
  }
}