'use strict';

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

import EditionListFetcher from '../fetchers/edition_list_fetcher.js';

class EditionListActions {
    constructor() {
        this.generateActions(
            'updateEditionList',
            'refreshEditionList',
            'selectEdition',
            'clearAllEditionSelections',
            'closeAllEditionLists',
            'toggleEditionList'
        );
    }

    fetchEditionList({ pieceId, page, pageSize, orderBy, orderAsc, filterBy, maxEdition }) {
        if ((!orderBy && typeof orderAsc === 'undefined') || !orderAsc) {
            orderBy = 'edition_number';
            orderAsc = true;
        }

        // Taken from: http://stackoverflow.com/a/519157/1263876
        if ((typeof page === 'undefined' || !page) && (typeof pageSize === 'undefined' || !pageSize)) {
            page = 1;
            pageSize = 10;
        }

        let itemsToFetch = pageSize;
        // If we only want to fetch up to a specified edition, fetch all pages up to it
        // as one page and adjust afterwards
        if (typeof maxEdition === 'number') {
            itemsToFetch = Math.ceil(maxEdition / pageSize) * pageSize;
            page = 1;
        }

        return Q.Promise((resolve, reject) => {
            EditionListFetcher
                .fetch({ pieceId, page, orderBy, orderAsc, filterBy, pageSize: itemsToFetch })
                .then((res) => {
                    if (res && !res.editions) {
                        throw new Error('Piece has no editions to fetch.');
                    }

                    this.actions.updateEditionList({
                        pieceId,
                        page,
                        pageSize,
                        orderBy,
                        orderAsc,
                        filterBy,
                        maxEdition,
                        count: res.count,
                        editionListOfPiece: res.editions
                    });
                    resolve(res);
                })
                .catch((err) => {
                    console.logGlobal(err);
                    reject(err);
                });
        });
    }
}

export default alt.createActions(EditionListActions);