/*
 * @file        LevelMatching.hpp
 * @brief
 *
 * レベルによるマッチング処理
 *
 * Copyright MONOBIT Inc. All rights reserved.
 */

#ifndef __LEVEL_MATCHING_HPP__
#define __LEVEL_MATCHING_HPP__

#include "./MatchingBase.hpp"

class LevelMatching : public MatchingBase
{
public:
        // テーブル作成情報構造体
        struct CreateTableInfo {
                uint32  level;          // レベル
        };
        
        // 検索用ルーム情報構造体
        struct SearchRoomInfo {
                RoomInfo        roomInfo;               // ルーム情報
        };
        
        typedef std::vector<SearchRoomInfo>     SearchRoomInfoList;     // 検索用ルーム情報リスト型
        
public:
        /**
         * コンストラクタ
         */
        LevelMatching();
        
        /**
         * デストラクタ
         */
        virtual ~LevelMatching();
        
        /**
         * ルームの新規作成
         * 
         * @info        所有者の入室も同時に行う
         * 
         * @param       createRoomInfo          ルーム作成情報
         * @param       pCreateTableInfo        テーブル作成情報
         * 
         * @return      trueなら成功、falseなら失敗
         */
        virtual bool CreateRoom( CreateRoomInfo& createRoomInfo, CreateTableInfo* pCreateTableInfo );
        
        /**
         * ルームの検索
         * 
         * @param       level_min                       レベル最小値
         * @param       level_max                       レベル最大値
         * @param       searchRoomInfoList      検索用ルーム情報リスト
         * @param       limit                           最大数
         * @param       offset                          開始オフセット
         * 
         * @return      trueなら成功、falseなら失敗
         */
        virtual bool SearchRoom( uint32 level_min, uint32 level_max, SearchRoomInfoList& searchRoomInfoList, uint32 limit = 0, uint32 offset = 0 );
        
protected:
        /**
         * テーブル作成クエリ
         * 
         * @return      trueなら成功、falseなら失敗
         */
        virtual bool QueryCreateTable();
        
        /**
         * ルーム作成クエリ
         *
         * @param       createRoomInfo  ルーム作成情報
         * @param       pArg                    汎用引数
         *
         * @return      trueなら成功、falseなら失敗
         */
        virtual bool QueryCreateRoom( CreateRoomInfo& createRoomInfo, void* pArg );
        
        /**
         * ルームの削除クエリ
         * 
         * @param       roomId          ルームID
         * 
         * @return      trueなら成功、falseなら失敗
         */
        virtual bool QueryDeleteRoom( uint64 roomId );
};

#endif