'use strict';

import { alt } from '../alt';

import PieceActions from '../actions/piece_actions';

import PieceSource from '../sources/piece_source';


class PieceStore {
    constructor() {
        this.getInitialState();

        this.bindActions(PieceActions);
        this.registerAsync(PieceSource);
        this.exportPublicMethods({
            getInitialState: this.getInitialState.bind(this)
        });
    }

    getInitialState() {
        this.piece = {};
        this.pieceMeta = {
            err: null
        };

        return {
            piece: this.piece,
            pieceMeta: this.pieceMeta
        }
    }

    onFetchPiece(pieceId) {
        this.getInstance().lookupPiece(pieceId);

        // Prevent alt from sending an empty change event when a request is sent
        // off to the source
        this.preventDefault();
    }

    onSuccessFetchPiece({ piece }) {
        if (piece) {
            this.onUpdatePiece(piece);
        } else {
            this.pieceMeta.err = new Error('Problem fetching the piece');
            console.logGlobal(this.pieceMeta.err);
        }
    }

    onErrorPiece(err) {
        console.logGlobal(err);
        this.pieceMeta.err = err;
    }

    onFlushPiece() {
        this.getInitialState();
    }

    onUpdatePiece(piece) {
        this.piece = piece;
        this.pieceMeta.err = null;
    }

    onUpdateProperty({ key, value }) {
        if (this.piece && key in this.piece) {
            this.piece[key] = value;
        } else {
            throw new Error('There is no piece defined in PieceStore or the piece object does not have the property you\'re looking for.');
        }
    }
}

export default alt.createStore(PieceStore, 'PieceStore');