/*
 * Cantata
 *
 * Copyright (c) 2017-2022 Craig Drummond <craig.p.drummond@gmail.com>
 *
 * ----
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 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
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

#include "onlinedb.h"
#include <QSqlQuery>
#include <QVariant>

static const QString subDir("online");

OnlineDb::OnlineDb(const QString& serviceName, QObject* p)
	: LibraryDb(p, serviceName), insertCoverQuery(nullptr), getCoverQuery(nullptr)
{
}

OnlineDb::~OnlineDb()
{
}

bool OnlineDb::init(const QString& dbFile)
{
	LibraryDb::init(dbFile);
	createTable("covers(artistId text, albumId text, url text)");
	createTable("stats(artists integer)");
	return true;
}

void OnlineDb::create()
{
	if (!db) {
		init(Utils::dataDir(subDir, true) + dbName + ".sql");
	}
}

void OnlineDb::startUpdate()
{
	updateStarted(currentVersion + 1);
	if (!db) {
		return;
	}
	QSqlQuery(*db).exec("delete from covers");
	QSqlQuery(*db).exec("drop index genre_idx");
}

void OnlineDb::endUpdate()
{
	updateFinished();
}

void OnlineDb::insertStats(int numArtists)
{
	if (!db) {
		return;
	}
	QSqlQuery(*db).exec("delete from stats");
	QSqlQuery(*db).exec("insert into stats(artists) values(" + QString::number(numArtists) + ")");
}

void OnlineDb::reset()
{
	delete insertCoverQuery;
	delete getCoverQuery;
	insertCoverQuery = nullptr;
	getCoverQuery = nullptr;
	LibraryDb::reset();
}

void OnlineDb::storeCoverUrl(const QString& artistId, const QString& albumId, const QString& url)
{
	if (!db) {
		return;
	}
	if (!insertCoverQuery) {
		insertCoverQuery = new QSqlQuery(*db);
		insertCoverQuery->prepare("insert into covers(artistId, albumId, url) "
		                          "values(:artistId, :albumId, :url)");
	}
	insertCoverQuery->bindValue(":artistId", artistId);
	insertCoverQuery->bindValue(":albumId", albumId);
	insertCoverQuery->bindValue(":url", url);
	insertCoverQuery->exec();
}

int OnlineDb::getStats()
{
	if (!db) {
		return -1;
	}
	QSqlQuery q(*db);
	q.exec("select artists from stats");
	if (q.next()) {
		return q.value(0).toInt();
	}
	return -1;
}

QString OnlineDb::getCoverUrl(const QString& artistId, const QString& albumId)
{
	if (0 != currentVersion && db) {
		if (!getCoverQuery) {
			getCoverQuery = new QSqlQuery(*db);
			getCoverQuery->prepare("select url from covers where artistId=:artistId and albumId=:albumId limit 1;");
		}
		getCoverQuery->bindValue(":artistId", artistId);
		getCoverQuery->bindValue(":albumId", albumId);
		getCoverQuery->exec();
		while (getCoverQuery->next()) {
			return getCoverQuery->value(0).toString();
		}
	}
	return QString();
}

#include "moc_onlinedb.cpp"
