/*
 * Copyright (C) 2011 4th Line GmbH, Switzerland
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.fourthline.konto.server.download;

import org.fourthline.konto.server.dao.CurrencyDAO;
import org.fourthline.konto.shared.entity.CurrencyPair;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author Christian Bauer
 */
public abstract class CurrencyDownloader {

    public static final int BATCH_SIZE = 5;

    final protected CurrencyDAO currencyDAO;

    protected CurrencyDownloader(CurrencyDAO currencyDAO) {
        this.currencyDAO = currencyDAO;
    }

    public CurrencyDAO getCurrencyDAO() {
        return currencyDAO;
    }

    public void updateCurrencies() throws Exception {
        updateCurrencies(null);
    }

    public void updateCurrencies(CurrencyPair pair) throws Exception {

        List<CurrencyPair> pairs;
        if (pair != null) {
            pairs = Arrays.asList(pair);
        } else {
            pairs = CurrencyPair.getPairs(getCurrencyDAO().getMonetaryUnits());
        }

        List<CurrencyPair> batch = new ArrayList();
        for (CurrencyPair p : pairs) {
            if (batch.size() == BATCH_SIZE) {
                updateExchangeRates(batch);
                persist(batch);
                batch.clear();
            }
            batch.add(p);
        }
        updateExchangeRates(batch);
        persist(batch);
    }

    protected void persist(List<CurrencyPair> pairs) {
        for (CurrencyPair pair : pairs) {
            getCurrencyDAO().persist(pair);
        }
    }

    abstract protected void updateExchangeRates(List<CurrencyPair> pairs) throws Exception;

}
