/*
    QAD - Qt ADvanced

    Ivan Pelipenko peri4ko@yandex.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser 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 Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef mapview_tile_cache_h
#define mapview_tile_cache_h

#include "mapview_types.h"

#include <QCache>
#include <QDir>
#include <QMutex>
#include <QQueue>
#include <QThread>
#include <QWaitCondition>

class MapView;

class MapViewTileCache: public QThread {
	Q_OBJECT

public:
	explicit MapViewTileCache(MapView * p);
	~MapViewTileCache();

	void setMinimumCacheSize(int bytes) {
		fixed_size_b = bytes;
		updateCacheSize();
	}
	void setAdditionalCacheSize(int mb) {
		add_size_b = mb * 1024 * 1024;
		updateCacheSize();
	}
	void setTileObsoleteTime(int secs) { secs_obsolete = secs; }

	void tileDownloaded(MapViewTypes::TileIndex index, const QPixmap & pixmap);
	MapViewTypes::TilePixmap getTile(MapViewTypes::TileIndex index, QRectF & rect_src);
	void clearCache();

	bool isTileFileExists(MapViewTypes::TileIndex index) const;

	QString cacheRoot() const { return cache_root; }
	void setCacheRoot(const QString & p);

	void tileProviderChanged();
	void setOfflineMode(bool yes);

private:
	MapViewTypes::TilePixmap getTileFromCache(MapViewTypes::TileIndex index);
	void updateCacheSize();
	void saveTile(MapViewTypes::TilePixmap * tile);
	void writeToDisk(const MapViewTypes::TilePixmap & tile);
	void run() override;

	MapView * parent;
	QString cache_root;
	QDir cache_dir;
	QWaitCondition cond;
	QMutex cond_mutex;
	int secs_obsolete = -1;
	int fixed_size_b = 0, add_size_b = 0;
	bool is_offline = false;
	QQueue<MapViewTypes::TilePixmap> queue;
	QCache<quint64, MapViewTypes::TilePixmap> tile_cache;

public slots:

private slots:

signals:
	void tileReady(MapViewTypes::TilePixmap);
};


#endif
