/*
 * appmysql.h
 *
 *  Created on: Oct 14, 2025
 *      Author: user
 */

#ifndef SRC_APPMYSQL_H_
#define SRC_APPMYSQL_H_

#include <mysql.h>
#include "jsonobject.h"


const uint32 appSQLCfgVer = 1;


class CAppDatabaseCfg : public CJSONRootObject
{
public:
	enum AppDbType { appDataSQLite, appDataMySQL, appDataMSSQL };

private:
	AppDbType dbType_;

	std::string server_;
	std::string server2_; // 2nd line for config screen in case one line input is not long enough
	std::string user_;
	std::string password_;
	std::string database_;

	bool chg_;

public:
	CAppDatabaseCfg(void) :
		dbType_(appDataSQLite),
		server_("127.0.0.1"),
		server2_(""),
		user_(MYSQL_DEFAULT_DBUSER),
		password_(""),
		database_(MYSQL_DEFAULT_DB),
		chg_(false)
	{
		// Setup JSON tags

		// Associate string "sqlite" equals enum value appDataSQLite and "mysql" equals enum value appDataMySQL
		std::string jsonEnum =
				"sqlite=" + std::to_string(appDataSQLite) +
				",mysql=" + std::to_string(appDataMySQL) +
				",mssql=" + std::to_string(appDataMSSQL);

		SetTagEnum(&dbType_, "dbtype", jsonEnum);

		SetTag(server_, "server");
		SetTag(server2_, "server2");
		SetTag(user_, "user");
		SetTag(password_, "passw");
		SetTag(database_, "database");

	}

	AppDbType GetDBType(void) { return dbType_; }

	// std::string& GetServer(void) { return server_; }
	// std::string& GetServer2(void) { return server2_; }
	std::string GetServer(void) { return server_ + server2_; }

	std::string& GetUser(void) { return user_; }
	std::string& GetPassword(void) { return password_; }
	std::string& GetDatabase(void) { return database_; }

	void UpdateConfigForm(CForm *pForm);

	int Config(void);

	int FirstTimePrompt(void);

	bool GetChanged(void) { return chg_; }

	const char* GetDBTypeLabel(void) {
		switch(dbType_)
		{
		case appDataMySQL:
			return "MySQL";
		case appDataMSSQL:
			return "SQL Server";
		default:
			return "SQLite";
		}
	}
};

#endif /* SRC_APPMYSQL_H_ */
