/* -*-mode: C; fill-column: 78; c-basic-offset: 4; -*- */
/* 
 * Copyright 1997 - 2006 by Eric House (xwords@eehouse.org).  All rights reserved.
 *
 * 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; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

#ifndef _NWGAMEST_H_
#define _NWGAMEST_H_

/* The new game/game info dialog is complicated, especially in non
 * XWFEATURE_STANDALONE_ONLY case.  The number of rows must be changed
 * as the number of players changes, and whether the password field is
 * enabled changes with the robot status etc.  This file encapsulates
 * all that logic, reducint the platform's role to reporting UI events
 * and reflecting state changes, as reported by callbacks, in the
 * platform's widgets.
 */

#include "comtypes.h"
EXTERN_C_START

#include "mempool.h"
#include "server.h"
#include "comms.h"
#include "util.h"
#include "game.h"

typedef struct NewGameCtx NewGameCtx;


typedef enum {
#ifndef XWFEATURE_STANDALONE_ONLY
    NG_COL_REMOTE,
#endif
    NG_COL_NAME
    ,NG_COL_ROBOT
    ,NG_COL_PASSWD
} NewGameColumn;

typedef enum {
#ifndef XWFEATURE_STANDALONE_ONLY
    NG_ATTR_ROLE,
    NG_ATTR_REMHEADER,
#endif
    NG_ATTR_NPLAYERS
    ,NG_ATTR_NPLAYHEADER
    ,NG_ATTR_CANJUGGLE
} NewGameAttr;

typedef union NGValue {
    const XP_UCHAR* ng_cp;
    XP_U16 ng_u16;
    XP_Bool ng_bool;
    DeviceRole ng_role;
} NGValue;

/* Enable or disable (show or hide) controls */
typedef void (*NewGameEnableColProc)( void* closure, XP_U16 player, 
                                      NewGameColumn col, XP_TriEnable enable );
typedef void (*NewGameEnableAttrProc)( void* closure, NewGameAttr attr, 
                                       XP_TriEnable enable );
/* Get the contents of a control.  Type of param "value" is either
   boolean or char* */
typedef void (*NgCpCallbk)( NGValue value, const void* cpClosure );
typedef void (*NewGameGetColProc)( void* closure, XP_U16 player, 
                                   NewGameColumn col, 
                                   NgCpCallbk cpcb, const void* cbClosure );
/* Set the contents of a control.  Type of param "value" is either
   boolean or char* */
typedef void (*NewGameSetColProc)( void* closure, XP_U16 player, 
                                   NewGameColumn col, const NGValue value );

typedef void (*NewGameSetAttrProc)(void* closure, NewGameAttr attr,
                                   const NGValue value );


NewGameCtx* newg_make( MPFORMAL XP_Bool isNewGame, 
                       XW_UtilCtxt* util,
                       NewGameEnableColProc enableColProc, 
                       NewGameEnableAttrProc enableAttrProc, 
                       NewGameGetColProc getColProc,
                       NewGameSetColProc setColProc,
                       NewGameSetAttrProc setAttrProc,
                       void* closure );
void newg_destroy( NewGameCtx* ngc );

void newg_load( NewGameCtx* ngc, const CurGameInfo* gi );
XP_Bool newg_store( NewGameCtx* ngc, CurGameInfo* gi, XP_Bool warn );

void newg_colChanged( NewGameCtx* ngc, XP_U16 player );
void newg_attrChanged( NewGameCtx* ngc, NewGameAttr attr, 
                       NGValue value );

/** newg_juggle: Return XP_TRUE if a juggle happened, XP_FALSE if randomness
 * dictated that all players stay put.  Platforms can call repeatedly until
 * true if they want to force change.
 */
XP_Bool newg_juggle( NewGameCtx* ngc );

EXTERN_C_END

#endif /*  _NWGAMEST_H_ */