// Path: core/src/de/golfgl/gdxgamesvcs/achievement/IFetchAchievementsResponseListener.java
// public interface IFetchAchievementsResponseListener {
// 
//     /**
//      * Response with achievement list
//      *
//      * @param achievements null if achievements couldn't be fetched.
//      */
//     void onFetchAchievementsResponse(Array<IAchievement> achievements);
// 
// }
// 
// Path: core/src/de/golfgl/gdxgamesvcs/gamestate/IFetchGameStatesListResponseListener.java
// public interface IFetchGameStatesListResponseListener {
//     /**
//      * Called when game state list was loaded
//      *
//      * @param gameStates null if game states couldn't be fetched.
//      */
//     void onFetchGameStatesListResponse(Array<String> gameStates);
// }
// 
// Path: core/src/de/golfgl/gdxgamesvcs/gamestate/ILoadGameStateResponseListener.java
// public interface ILoadGameStateResponseListener {
//     /**
//      * Returns a game state that was saved in Cloud services
//      *
//      * @param gameState null if loading failed
//      */
//     public void gsGameStateLoaded(byte[] gameState);
// }
// 
// Path: core/src/de/golfgl/gdxgamesvcs/gamestate/ISaveGameStateResponseListener.java
// public interface ISaveGameStateResponseListener {
// 
//     /**
//      * Result of save game request
//      *
//      * @param success   true if game state was sucessfully saved
//      * @param errorCode null if succesful
//      */
//     void onGameStateSaved(boolean success, String errorCode);
// }
// 
// Path: core/src/de/golfgl/gdxgamesvcs/leaderboard/IFetchLeaderBoardEntriesResponseListener.java
// public interface IFetchLeaderBoardEntriesResponseListener {
//     /**
//      * Called when leaderBoard entries are received.
//      *
//      * @param leaderBoard null if leaderBoard couldn't be fetched.
//      */
//     void onLeaderBoardResponse(Array<ILeaderBoardEntry> leaderBoard);
// }


import de.golfgl.gdxgamesvcs.achievement.IFetchAchievementsResponseListener;
import de.golfgl.gdxgamesvcs.gamestate.IFetchGameStatesListResponseListener;
import de.golfgl.gdxgamesvcs.gamestate.ILoadGameStateResponseListener;
import de.golfgl.gdxgamesvcs.gamestate.ISaveGameStateResponseListener;
import de.golfgl.gdxgamesvcs.leaderboard.IFetchLeaderBoardEntriesResponseListener;

    /**
     * Delete an existing game state.
     * Should only be called when {@link GameServiceFeature#GameStateDelete} is supported,
     * check {@link #isFeatureSupported(GameServiceFeature)} prior to call this method.
     *
     * @param fileId  game state Id
     * @param success response listener, can be null. Called when a delete attempt succeeded or failed
     * @return true if delete attempt could be made, false otherwise
     */
    boolean deleteGameState(final String fileId, ISaveGameStateResponseListener success);

    /**
     * Fetch current player's game states.
     *
     * @param callback
     * @return false if fetch attempt could not be made. Response listener will not get called in that case.
     * @throws UnsupportedOperationException if not supported by game service client, so check
     *                                       {@link #isFeatureSupported(GameServiceFeature)} prior to call this method.
     */
    boolean fetchGameStates(IFetchGameStatesListResponseListener callback);

    /**
     * Queries if a certain feature is available for this Game Service
     *
     * @param feature
     * @return true if feature is supported by implementation and game service
     */
    boolean isFeatureSupported(GameServiceFeature feature);

// Path: core/src/de/golfgl/gdxgamesvcs/achievement/IFetchAchievementsResponseListener.java
// public interface IFetchAchievementsResponseListener {
// 
//     /**
//      * Response with achievement list
//      *
//      * @param achievements null if achievements couldn't be fetched.
//      */
//     void onFetchAchievementsResponse(Array<IAchievement> achievements);
// 
// }
// 
// Path: core/src/de/golfgl/gdxgamesvcs/gamestate/IFetchGameStatesListResponseListener.java
// public interface IFetchGameStatesListResponseListener {
//     /**
//      * Called when game state list was loaded
//      *
//      * @param gameStates null if game states couldn't be fetched.
//      */
//     void onFetchGameStatesListResponse(Array<String> gameStates);
// }
// 
// Path: core/src/de/golfgl/gdxgamesvcs/gamestate/ILoadGameStateResponseListener.java
// public interface ILoadGameStateResponseListener {
//     /**
//      * Returns a game state that was saved in Cloud services
//      *
//      * @param gameState null if loading failed
//      */
//     public void gsGameStateLoaded(byte[] gameState);
// }
// 
// Path: core/src/de/golfgl/gdxgamesvcs/gamestate/ISaveGameStateResponseListener.java
// public interface ISaveGameStateResponseListener {
// 
//     /**
//      * Result of save game request
//      *
//      * @param success   true if game state was sucessfully saved
//      * @param errorCode null if succesful
//      */
//     void onGameStateSaved(boolean success, String errorCode);
// }
// 
// Path: core/src/de/golfgl/gdxgamesvcs/leaderboard/IFetchLeaderBoardEntriesResponseListener.java
// public interface IFetchLeaderBoardEntriesResponseListener {
//     /**
//      * Called when leaderBoard entries are received.
//      *
//      * @param leaderBoard null if leaderBoard couldn't be fetched.
//      */
//     void onLeaderBoardResponse(Array<ILeaderBoardEntry> leaderBoard);
// }


// Path: core/src/de/golfgl/gdxgamesvcs/IGameServiceClient.java
import de.golfgl.gdxgamesvcs.achievement.IFetchAchievementsResponseListener;
import de.golfgl.gdxgamesvcs.gamestate.IFetchGameStatesListResponseListener;
import de.golfgl.gdxgamesvcs.gamestate.ILoadGameStateResponseListener;
import de.golfgl.gdxgamesvcs.gamestate.ISaveGameStateResponseListener;
import de.golfgl.gdxgamesvcs.leaderboard.IFetchLeaderBoardEntriesResponseListener;


    /**
     * Delete an existing game state.
     * Should only be called when {@link GameServiceFeature#GameStateDelete} is supported,
     * check {@link #isFeatureSupported(GameServiceFeature)} prior to call this method.
     *
     * @param fileId  game state Id
     * @param success response listener, can be null. Called when a delete attempt succeeded or failed
     * @return true if delete attempt could be made, false otherwise
     */
    boolean deleteGameState(final String fileId, ISaveGameStateResponseListener success);

    /**
     * Fetch current player's game states.
     *
     * @param callback
     * @return false if fetch attempt could not be made. Response listener will not get called in that case.
     * @throws UnsupportedOperationException if not supported by game service client, so check
     *                                       {@link #isFeatureSupported(GameServiceFeature)} prior to call this method.
     */
    boolean fetchGameStates(IFetchGameStatesListResponseListener callback);

    /**
     * Queries if a certain feature is available for this Game Service
     *
     * @param feature
     * @return true if feature is supported by implementation and game service
     */
    boolean isFeatureSupported(GameServiceFeature feature);

    public static enum GameServiceFeature {