/**
 * @brief Removes all dialogs with a specific prefix.
 * @param prefix The prefix id of dialogs to remove.
 * @return The list of all removed dialogs (key, value).
 * @throws EditorException in case of error.
 */
QList<QPair<QString, DialogData>> DialogsModel::delete_prefix(
    const QString& prefix) {

  QList<QPair<QString, DialogData>> list;
  for (QString key : get_ids(prefix)) {
    list.push_back(QPair<QString, DialogData>(key, get_dialog_data(key)));
    delete_dialog(key);
  }
  return list;
}
/* Основная функция */
int main() {
	# define ACTION(str) if (!strcmp(#str, action))
	setlocale(LC_ALL, "Ru");
	BookDB* db = NULL;
	char filename[MAX_STRING_LENGTH] = "\0";
	char action[MAX_STRING_LENGTH];
	print_hello();
	/* Цикл обработки событий */
	forever {
		printf("<! ");
		scanf("%s", action);
		
		ACTION(help) {
			print_help();
			continue;
		}
		
		ACTION(exit) {
			if (db) {
				close_db(db, filename);
				db = NULL;
				filename[0] = '\0';
			}
			break;
		}
		
		ACTION(close) {
			if (db) {
				close_db(db, filename);
				db = NULL;
				filename[0] = '\0';
				output("База данных закрыта!\n");
			} else db_not_loaded_error();
			continue;
		}
		
		ACTION(create) {
			if (db) {
				close_db(db, filename);
				filename[0] = '\0';
				db = NULL;
			}
			int n = 0;
			output("Предполагаемая размерность Базы Данных\n");
			input("%d", &n);
			db = create_db(n);
			output("База данных для %i элементов создана!\n", n);
			continue;
		}
		
		ACTION(load) {
			if (db) {
				close_db(db, filename);
				filename[0] = '\0';
				db = NULL;
			}
			do {
				output("Имя файла базы данных\n");
				input("%s", filename);
			} while (strlen(filename) < 1);
			db = load_db(filename);
			if (!db) {
				output("Неверное имя файла!\n");
				filename[0] = '\0';
			} else {
				output(">> База данных успешно загружена!\n");
			}
			continue;
		}
		
		ACTION(save) {
			if (db) {
				save_db_dialog(db, filename);
				output(">> База данных успешно сохранена!\n");
			} else db_not_loaded_error();
			continue;
		}
		
		ACTION(list) {
			if (db != 0) {
				list_db(db);
			} else db_not_loaded_error();
			continue;
		}
		
		ACTION(find) {
			if (db) {
				find_dialog(db);
			} else db_not_loaded_error();
			continue;
		}
		
		ACTION(new) {
			if (db) {
				new_dialog(db);
			} else db_not_loaded_error();
			continue;
		}
		
		ACTION(delete) {
			if (db) {
				delete_dialog(db);
			} else db_not_loaded_error();
			continue;
		}
		
		ACTION(size) {
			if (db) {
				output("Книг в базе данных - %d\n", db->count);
			} else db_not_loaded_error();
			continue;
		}
		
		ACTION(sort) {
			if (db) {
				sort_dialog(db);
			} else db_not_loaded_error();
			continue;
		}
		
		printf("!! Неизвестная команда \"%s\"\n", action);
	}
	# undef ACTION
	return 0;
}