/*
   misc2_callback_func.c

   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.
*/

#include "callbacks.h"
#include "callback_func.h"
#include "file.h"
#include "finance.h"
#include "free.h"
#include "game_gui.h"
#include "job.h"
#include "league.h"
#include "maths.h"
#include "misc.h"
#include "misc2_callback_func.h"
#include "option.h"
#include "player.h"
#include "support.h"
#include "team.h"
#include "treeview.h"
#include "treeview2.h"
#include "treeview_helper.h"
#include "transfer.h"
#include "user.h"
#include "window.h"

/** Transfer a user player. */
void
misc2_callback_transfer_user_player(void)
{
#ifdef DEBUG
    printf("misc2_callback_transfer_user_player\n");
#endif

    Team *new_team = transoff(stat2, 0).tm;

    if (current_user.tm->players->len - 1 < const_int("int_team_min_players"))
    {
    	game_gui_show_warning(_("Your team can't have less than 11 players."));
    }
    else
    {
	    if(team_is_user(new_team) != -1)
    	{
			if((new_team->players->len < const_int("int_team_max_players")) &&
			   (BUDGET(team_is_user(new_team)) >= transoff(stat2, 0).fee))
			{
		    	current_user.money += transoff(stat2, 0).fee;
			    current_user.money_in[1][MON_IN_TRANSFERS] += transoff(stat2, 0).fee;
			    user_from_team(new_team)->money -= transoff(stat2, 0).fee;
	    		user_from_team(new_team)->money_out[1][MON_OUT_TRANSFERS] -= 
				transoff(stat2, 0).fee;

		    	if(player_of_id_team(trans(stat2).tm, trans(stat2).id)->id ==
			       opt_user_int("int_opt_user_penalty_shooter"))
				opt_user_set_int("int_opt_user_penalty_shooter", -1);

			    player_copy(player_of_id_team(trans(stat2).tm, trans(stat2).id),
					new_team, new_team->players->len);
		    	player_of_idx_team(new_team, new_team->players->len - 1)->contract = 
				(gfloat)math_rndi(const_int("int_transfer_contract_lower"),
						  const_int("int_transfer_contract_upper"));
	    		player_of_idx_team(new_team, new_team->players->len - 1)->wage = 
				transoff(stat2, 0).wage;
			    g_array_remove_index(current_user.tm->players, 
						 player_id_index(current_user.tm, trans(stat2).id));
		    	transfer_remove_player(stat2);
			}
			else
			{
			    game_gui_show_warning(_("%s couldn't afford to buy %s or his roster was full."),
						  user_from_team(new_team)->name, 
						  player_of_id_team(trans(stat2).tm, trans(stat2).id)->name);
	    		user_event_add(user_from_team(new_team), EVENT_TYPE_WARNING, -1, -1, NULL, 
					   _("You didn't have enough money to buy %s or your roster was full."),
					   player_of_id_team(trans(stat2).tm, trans(stat2).id)->name);
			    g_array_remove_index(trans(stat2).offers, 0);
	    		if(trans(stat2).offers->len > 0 && transoff(stat2, 0).status == TRANSFER_OFFER_NOT_CONSIDERED)
					transoff(stat2, 0).status = TRANSFER_OFFER_ACCEPTED;
			}
    	}
    	else
    	{		
			current_user.money += transoff(stat2, 0).fee;
			current_user.money_in[1][MON_IN_TRANSFERS] += transoff(stat2, 0).fee;
			player_remove_from_team(current_user.tm, player_id_index(current_user.tm, trans(stat2).id));
    	}
    }

    treeview_show_user_player_list();
    game_gui_set_main_window_header();
    on_button_transfers_clicked(NULL, NULL);    
}

/** Transfer a cpu player to a user team. */
void
misc2_callback_transfer_cpu_player(void)
{
#ifdef DEBUG
    printf("misc2_callback_transfer_cpu_player\n");
#endif

    if(current_user.tm->players->len > const_int("int_team_max_players") ||
       BUDGET(cur_user) < transoff(stat2, 0).fee)
    {
	game_gui_show_warning(_("Your player roster is full or you don't enough money."));
	return;
    }	

    player_copy(player_of_id_team(trans(stat2).tm, trans(stat2).id),
		current_user.tm, current_user.tm->players->len);
    player_of_idx_team(current_user.tm, current_user.tm->players->len - 1)->contract =
	(gfloat)math_rndi(const_int("int_transfer_contract_lower"),
			  const_int("int_transfer_contract_upper"));
    player_of_idx_team(current_user.tm, current_user.tm->players->len - 1)->wage =
	transoff(stat2, 0).wage;
    user_from_team(current_user.tm)->money -= transoff(stat2, 0).fee;
    user_from_team(current_user.tm)->money_out[1][MON_OUT_TRANSFERS] -=
	transoff(stat2, 0).fee;
    player_replace_by_new(player_of_id_team(trans(stat2).tm, trans(stat2).id), FALSE);
    transfer_remove_player(stat2);

    treeview_show_user_player_list();
    game_gui_set_main_window_header();

    if(week < transfer_get_deadline() || transfer_list->len > 0 )
	on_button_transfers_clicked(NULL, NULL);
    else
	on_button_back_to_main_clicked(NULL, NULL);
}

/** Change the user team's structure to a value he's specified. */
gboolean
misc2_callback_change_structure(gint structure)
{
#ifdef DEBUG
    printf("misc2_callback_change_structure\n");
#endif

    gint poss_struct = team_find_appropriate_structure(current_user.tm);

    if(math_get_place(structure, 1) + math_get_place(structure, 2) + 
       math_get_place(structure, 3) != 
       math_get_place(poss_struct, 1) + math_get_place(poss_struct, 2) + 
       math_get_place(poss_struct, 3))
    {
	game_gui_show_warning(_("The structure value %d is invalid."), structure);
	return FALSE;
    }

    team_change_structure(current_user.tm, structure);
    treeview_show_user_player_list();

    setsav0;

    return TRUE;
}

/** Handle a click on the contract offer button. */
void
misc2_callback_contract_offer(void)
{
#ifdef DEBUG
    printf("misc2_callback_contract_offer\n");
#endif

    gint i;
    gchar buf[SMALL];
    GtkSpinButton *spinbutton;
    gint value = 0;
    Player *pl = (Player*)statp;

    gtk_widget_set_sensitive(lookup_widget(window.contract, "button_contract_cancel"), FALSE);

    for(i=0;i<4;i++)
    {
	sprintf(buf, "radiobutton_contract%d", i + 1);

	if(gtk_toggle_button_get_active(
	       GTK_TOGGLE_BUTTON(lookup_widget(window.contract, buf))))
	{
	    sprintf(buf, "spinbutton_contract%d", i + 1);
	    spinbutton = GTK_SPIN_BUTTON(lookup_widget(window.contract, buf));
	    value = gtk_spin_button_get_value_as_int(spinbutton);

	    if(value >= (gint)rint((gfloat)stat1 * 
				   (1 + (i * const_float("float_contract_scale_factor") *
					 powf(-1, (pl->age > pl->peak_age))))))
	    {
		pl->contract += (i + 1);
		pl->offers = 0;
		pl->wage = value;
		game_gui_show_warning(_("%s accepts your offer."), pl->name);
		window_destroy(&window.contract);
	    }
	    else
	    {
		pl->offers++;
		if(pl->offers < const_int("int_contract_max_offers"))
		    game_gui_show_warning(_("%s rejects your offer. You may still make %d offers."), 
					  pl->name, 
					  const_int("int_contract_max_offers") - pl->offers);
		else
		{
		    game_gui_show_warning(_("%s rejects your offer and won't negotiate with you anymore. You should sell him before his contract expires (he'll simply leave your team otherwise)."), 
					  pl->name);
		    window_destroy(&window.contract);
		}
	    }

	    break;
	}
    }
}

/** Add a user to the users array. */
void
misc2_callback_add_user(void)
{
#ifdef DEBUG
    printf("misc2_callback_add_user\n");
#endif

    GtkTreeView *treeview_user_management_teams =
	GTK_TREE_VIEW(lookup_widget(window.user_management,
				    "treeview_user_management_teams"));
    GtkEntry *entry_user_management = 
	GTK_ENTRY(lookup_widget(window.user_management, "entry_user_management"));
    const gchar *user_name = gtk_entry_get_text(entry_user_management);
    User new_user = user_new();
    Team *tm = (Team*)treeview_helper_get_pointer(treeview_user_management_teams, 2);
    
    if(strlen(user_name) > 0)
    {
	misc_string_assign(&new_user.name, user_name);    
	gtk_entry_set_text(entry_user_management, "");
    }

    new_user.tm = tm;
    new_user.team_id = tm->id;

    user_history_add(&new_user, USER_HISTORY_START_GAME,
		     tm->name, league_cup_get_name_string(tm->clid),
		     NULL, NULL);

    g_array_append_val(users, new_user);

    file_load_user_conf_file(&usr(users->len - 1));

    user_set_up_team(&usr(users->len - 1), TRUE);

    treeview_show_users(
	GTK_TREE_VIEW(lookup_widget(window.user_management,
				    "treeview_user_management_users")));
    treeview_show_team_list(treeview_user_management_teams, FALSE, FALSE);

    setsav0;
}

/** Handle a click in the MM window treeview.
 @param widget The treeview widget.
 @param row_num The row that's been clicked on.
 @param col_num The column number. */
void
misc2_callback_mmatches_button_press(GtkWidget *widget, gint row_num, gint col_num)
{
#ifdef DEBUG
    printf("misc2_callback_mmatches_button_press\n");
#endif

     
    if(row_num < current_user.mmatches->len)
    {
	if(col_num == TREEVIEW_MMATCH_COL_REPLAY)
	{
	    stat1 = STATUS_SHOW_LAST_MATCH;
	    stat3 = 0;
	    callback_show_last_match(
		TRUE, 
		&g_array_index(current_user.mmatches, MemMatch, row_num).lg);
	}
	else if(col_num == TREEVIEW_MMATCH_COL_REMOVE)
	{
	    gtk_widget_hide(widget);
	    free_g_string(&g_array_index(current_user.mmatches, MemMatch, row_num).
			  competition_name);
	    free_gchar_ptr(g_array_index(current_user.mmatches, MemMatch, row_num).
			   country_name);
	    free_live_game(&g_array_index(current_user.mmatches, MemMatch, row_num).lg);
	    g_array_remove_index(current_user.mmatches, row_num);
	    treeview2_show_mmatches();
	    gtk_widget_show(widget);
	}
	else if(col_num == TREEVIEW_MMATCH_COL_EXPORT)
	{
	    stat5 = STATUS_SELECT_MM_FILE_EXPORT;
	    stat4 = row_num;
	    window_show_file_sel();
	}
    }
    else if(row_num == current_user.mmatches->len && col_num == 1)
    {
	if(current_user.live_game.units->len == 0)
	{
	    game_gui_show_warning(_("No match stored."));
	    return;
	}

	user_mm_add_last_match(FALSE, FALSE);
	treeview2_show_mmatches();
    }
}

/** Find out whether the user's application for the job
    is accepted and show the appropriate popups.
    @return TRUE if accepted, FALSE otherwise. */
gboolean
misc2_callback_evaluate_job_application(Job *job, User *user)
{
#ifdef DEBUG
    printf("misc2_callback_evaluate_job_application\n");
#endif

    if(!query_job_application_successful(job, user))
    {
	game_gui_show_warning(
	    _("The owners of %s politely reject your application. You're not successful enough in their eyes."),
	    job_get_team(job)->name);
	return FALSE;
    }

    if(job->type != JOB_TYPE_NATIONAL)
    {
	game_gui_show_warning(
	    /* A lame duck is someone who will quit his job soon and thus doesn't have
	       a lot of influence/impact anymore, e.g. an American president during
	       the last 2 years of his second presidency. */
	    _("The owners of %s accept your application. Since %s don't want to get stuck with a lame duck, you get fired instantly and spend the rest of the current season tending your garden."),
	    job_get_team(job)->name, user->tm->name);
	job_change_country(job);
    }
    else
	game_gui_show_warning(
	    _("The owners of %s accept your application."),
	    job_get_team(job)->name);

    user_change_team(user, team_of_id(job->team_id));

    if(job->type == JOB_TYPE_NATIONAL)
	job_remove(job, TRUE);
    else
	free_jobs(TRUE);
	    
    return TRUE;
}
