/*
   league_struct.h

   Bygfoot Football Manager -- a small and simple GTK2-based
   football management game.

   http://bygfoot.sourceforge.net

   Copyright (C) 2005  Gyözö Both (gyboth@bygfoot.com)

   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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/

#ifndef LEAGUE_STRUCT_H
#define LEAGUE_STRUCT_H

#include "bygfoot.h"
#include "stat_struct.h"
#include "table_struct.h"

enum PromRelType
{
    PROM_REL_PROMOTION = 0,
    PROM_REL_RELEGATION,
    PROM_REL_NONE
};

/**
   An element representing a promotion or relegation rule.
   This means, a PromRelElement specifies a range of teams
   that get promoted or relegated to a given league.
   @see PromRel
*/
typedef struct
{
    gint ranks[2]; /**< The range of teams; default 0 and 0 */
    gint from_table; /**< From which table to pick the teams in case there are several. Default: 0. */
    gchar *dest_sid; /**< The id of the destination league. Default "" */
    gint type; /**< Type. Promotion or relegation or none. */
    /** The maximum number of teams to promote/relegate.  This can be different the
     * size of the range of teams, since some leagues have teams
     * (e.g. reserve teams) that may be inelligible for promotion.  For example,
     * a league could promote the top 2 elegible teams from positions 1-3.
     * In that case ranks[0] = 1, ranks[1] = 3 and num_teams = 2.
     */
    gint num_teams;
} PromRelElement;

/**
   An struct representing promotion/relegation games.
*/
typedef struct
{
    gint ranks[2]; /**< The range of teams; default 0 and 0.  This is only valid
                        loser_sid == NULL. */
    /** The id of the league the promotion games winner gets promoted to. Default "" */
    gchar *dest_sid;
    /** The id of the league the promotion games losers get moved to. Default "" */
    gchar *loser_sid;
    /** Number of teams that advance from the promotion games. Default: 1. */
    gint number_of_advance;    
    /** The cup determining how the promotion games are handled. */
    gchar *cup_sid;

} PromGames;

/**
   This structure specifies how promotion and relegation is handled in a league.
   It contains promotion and relegation rules in an array and possibly also
   a rule about promotion games to be played.
   @see PromRelElement
*/
typedef struct
{
    /** Array with promotion/relegation rules.
	@see PromRelElement
    */
    GArray *elements;

    /** Array with promotion/relegation games.
	@see PromGames
    */
    GArray *prom_games;

} PromRel;

/**
   A structure describing a different league joined to the current one
   in the sense that there are matches played between teams from both leagues
   like in the US conference system.
*/
typedef struct
{
    /** Sid of the joined league. */
    gchar *sid;
    /** How many round robins to schedule. */
    gint rr;
} JoinedLeague;

/**
   A structure containing a week when a new table
   gets created with nullified values for the league;
   older tables get stored.
*/
typedef struct
{
    gint add_week;
    gchar *name;
} NewTable;

/**
   A structure describing a custom break in the fixtures
   schedule occuring at a particular week.
*/
typedef struct
{
    /** In which week the break occurs. */
    gint week_number;
    /** Length of break in weeks. */
    gint length;
} WeekBreak;

/**
   Representation of a league.
   @see PromRel
   @see Table
*/
typedef struct
{
    /** Default value "" */
    gchar *name, *short_name, *sid, *symbol;
    /** The sid of the player names file the 
	teams in the league take their names from.
	Default: 'general', meaning the 'player_names_general.xml' file. */
    gchar *names_file;
    /** @see PromRel */
    PromRel prom_rel;
    /** Numerical id, as opposed to the string id 'sid'. */
    gint id;
    /** Layer of the league; this specifies which leagues are
	parallel. */
    gint layer;
    /** The first week games are played. Default 1. */
    gint first_week;
    /** Weeks between two matchdays. Default 1. */
    gint week_gap;
    /** Here we store intervals of fixtures during which
	there should be two matches in a week instead of one. */
    GArray *two_match_weeks[2];
    /** How many round robins are played. Important for
	small leagues with 10 teams or so. Default: 2. */
    gint round_robins;
    /** Number of weeks between the parts of a round robin. */
    GArray *rr_breaks;
    /** Number of yellow cards until a player gets banned. 
	Default 1000 (which means 'off', basically). */
    gint yellow_red;
    /** Average talent for the first season. Default: -1. */
    gfloat average_talent;
    /** Array of teams in the league.
	@see Team */
    GArray *teams;
    /** List of leagues joined fixture-wise to this one.
	@see JoinedLeague */
    GArray *joined_leagues;
    /** League tables. Usually only one, sometimes more than one is created.
	@see Table */
    GArray *tables;
    /** Array holding NewTable elements specifying when to add
        a new table to the tables array. */
    GArray *new_tables;
    /** The fixtures of a season for the league. */
    GArray *fixtures;
    /** A gchar pointer array of properties (like "inactive"). */
    GPtrArray *properties;
    /** Array of custom breaks in schedule. */
    GArray *week_breaks;
    /** The current league statistics. */
    LeagueStat stats;
    /** Pointer array with the sids of competitions that
        the fixtures of which should be avoided when scheduling
        the league fixtures. */
    GPtrArray *skip_weeks_with;
    /** Space delminted list of region names for this league.  Only Teams that
     * belong to one of these regions may play in this league. */
    gchar *regions;
} League;

#endif
