<script>
    class MovimientosHandler {
        props
        constructor({urls, loadingHandler, resultsHandler}) {
            this.props = {
                urls,
                loadingHandler,
                resultsHandler
            }
        }
        get() {
            return {
                movimientos: ({sociedades_ruts, mes}) => {
                    this.props.loadingHandler.show()
                    const method = 'post'
                    const body = new FormData()
                    sociedades_ruts.forEach(sociedad_rut => {
                        body.append('sociedades_ruts[]', sociedad_rut)
                    })
                    body.set('mes', [mes.getFullYear(), mes.getMonth() + 1, mes.getDate()].join('-'))
                    return APIClient.fetch(this.props.urls.get, {method, body}).then(response => {
                        if (!response) {
                            throw new Error('No se pudo obtener los movimientos')
                        }
                        return response.json().then(json => {
                            this.movimientos = json.movimientos
                            this.props.resultsHandler.props.movimientos = json.movimientos
                            this.props.resultsHandler.parse().movimientos()
                            return json.movimientos
                        })
                    }).catch(error => {
                        console.error(error)
                    }).finally(() => {
                        this.props.loadingHandler.hide()
                    })
                }
            }
        }
        edit() {
            return {
                movimiento: (data) => {
                    data.set('digito', Rut.digitoVerificador(data.get('rut')))
                    const method = 'post'
                    return APIClient.fetch(this.props.urls.edit, {method, body: data}).then(response => {
                        if (!response) {
                            throw new Error('No se pudo editar el movimiento')
                        }
                        return response.json().then(json => {
                            this.props.resultsHandler.props.movimientos = this.props.resultsHandler.props.movimientos.map(movimiento => {
                                if (movimiento.id === json.movimiento.id) {
                                    movimiento.detalles = json.movimiento.detalles
                                }
                                return movimiento
                            })
                            this.props.resultsHandler.parse().movimientos()
                        })
                    })
                }
            }
        }
        remove() {
            return {
                movimiento: id => {
                    const method = 'delete'
                    const url = this.props.urls.remove.replace(/\/$/, '') + '/' + id
                    return APIClient.fetch(url, {method}).then(response => {
                        if (!response) {
                            throw new Error('No se pudo eliminar el movimiento')
                        }
                        return response.json().then(json => {
                            this.props.resultsHandler.props.movimientos = this.props.resultsHandler.props.movimientos.filter(movimiento => movimiento.id !== id)
                            this.props.resultsHandler.parse().movimientos()
                        })
                    })
                }
            }
        }
        find() {
            return {
                id: id => {
                    return this.props.resultsHandler.props.movimientos.find(movimiento => movimiento.id === id)
                }
            }
        }
    }
</script>
