using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Drawing;
using Reversi;
using System.Reflection; 
using System.Runtime.CompilerServices;
[assembly: AssemblyTitle("Reversi")]
[assembly: AssemblyDescription("Gra planszowa Reversi")]
[assembly: AssemblyProduct("Reversi")]
[assembly: AssemblyCopyright("(c) Jacek Matulewski 2004, 2007")]
[assembly: AssemblyVersion("1.1.*")]

public partial class _Default : System.Web.UI.Page 
{
    private ReversiSilnikAI silnik=null;
	private Button[,] plansza=new Button[ReversiSilnikAI.planszaSzer,ReversiSilnikAI.planszaWys];
	private Color[] kolory={Color.Ivory, Color.Green, Color.Sienna};
 
	//komputer ma numer 2 i gra brązowymi
	private bool graPrzeciwkoKomputerowi=true;

	private void Page_Load(object sender, System.EventArgs e)
	{
        
	}

	#region Web Form Designer generated code
	override protected void OnInit(EventArgs e)
	{
		//
		// CODEGEN: This call is required by the ASP.NET Web Form Designer.
		//
		InitializeComponent();
		base.OnInit(e);

		inicjujPlansze();
	}

	/// <summary>
	/// Required method for Designer support - do not modify
	/// the contents of this method with the code editor.
	/// </summary>
	private void InitializeComponent()
	{
		this.button2.Click += new System.EventHandler(this.button2_Click);
		this.button1.Click += new System.EventHandler(this.button1_Click);
		this.Load += new System.EventHandler(this.Page_Load);
	}
	#endregion

	#region Metody pomocnicze
	private void inicjujPlansze()
	{
		//Odczytanie obiektu ReversiSilnikAI
		silnik=(ReversiSilnikAI)Session["silnik"];

		//Pobranie wersji aplikacji
		System.Reflection.Assembly a=System.Reflection.Assembly.GetExecutingAssembly();
		labelMessage.Text="Wersja:  <font color=green>"+a.GetName().Version+"</font>";

		//ustalanie rozmiaru przycisku
		int rozmiarPlanszy=400;
		int przyciskSzer=rozmiarPlanszy/ReversiSilnikAI.planszaSzer;
		int przyciskWys=rozmiarPlanszy/ReversiSilnikAI.planszaWys;

		//przygotowywanie tabeli z przyciskami
		TableRow[] wiersze=new TableRow[ReversiSilnikAI.planszaWys];
		for (int j=0; j<ReversiSilnikAI.planszaWys; j++)
		{
			wiersze[j]=new TableRow();
			table1.Rows.Add(wiersze[j]);
			for (int i=0; i<ReversiSilnikAI.planszaSzer; i++)
			{
				TableCell komorka=new TableCell();
				wiersze[j].Cells.Add(komorka);
				Button pole=new Button();

				pole.Width=przyciskSzer;
				pole.Height=przyciskWys;

				pole.Click+=new System.EventHandler(this.kliknieciePolaPlanszy);

				komorka.Controls.Add(pole);
				plansza[i,j]=pole;
			}
		}

		uzgodnijWygladPlanszy();
	}

	private void uzgodnijWygladPlanszy()
	{
		for (int i=0; i<ReversiSilnikAI.planszaSzer; i++)
			for (int j=0; j<ReversiSilnikAI.planszaWys; j++)
			{
				plansza[i,j].BackColor=kolory[silnik[i,j]];
				//plansza[i,j].Text=silnik[i,j].ToString();
			}

		//this.Text="Następny ruch gracz nr "+silnik.NumerGraczaWykonujacegoNastepnyRuch();
		button1.BackColor=kolory[silnik.NumerGraczaWykonujacegoNastepnyRuch()];
	}

	private void ruchKomputera()
	{
		int[] wspolrzedne=silnik.ProponujNajlepszyRuch();
		kliknieciePolaPlanszy(plansza[wspolrzedne[0],wspolrzedne[1]],null);
	}

	/**************************************/
	/* GŁÓWNA METODA "RZĄDZĄCA" PROGRAMEM */
	/**************************************/
	private void kliknieciePolaPlanszy(object sender,EventArgs e)
	{
		//szukamy pola planszy odpowiadającego kliknietemu przyciskowi
		int kliknietePoziomo=-1,kliknietePionowo=-1;
		for(int poziomo=0;poziomo<ReversiSilnikAI.planszaSzer;poziomo++)
			for(int pionowo=0;pionowo<ReversiSilnikAI.planszaWys;pionowo++)
				if (sender==plansza[poziomo,pionowo])
				{
					kliknietePoziomo=poziomo;
					kliknietePionowo=pionowo;
				}

		//labelMessage.Text="Gracz "+silnik.NumerGraczaWykonujacegoNastepnyRuch().ToString()+" wybrał pole "+kliknietePoziomo+", "+kliknietePionowo+".";

		//jezeli nie znaleziony - zglaszanie bledu
		if (kliknietePoziomo==-1 || kliknietePionowo==-1)
			throw new Exception("Nie zidentyfikowane pole planszy");

		//wykonanie ruchu
		int zapamietanyNumerGracza=silnik.NumerGraczaWykonujacegoNastepnyRuch();
		if (silnik.UstawPionek(kliknietePoziomo,kliknietePionowo))
		{
			uzgodnijWygladPlanszy();
			//listBox1.Items.Add(""+zapamietanyNumerGracza+": "+kliknietePoziomo+", "+kliknietePionowo);
			switch(zapamietanyNumerGracza)
			{
				case 1: listBox1.Items.Add(ReversiSilnikAI.SymbolPola(kliknietePoziomo,kliknietePionowo)); break;
				case 2: listBox2.Items.Add(ReversiSilnikAI.SymbolPola(kliknietePoziomo,kliknietePionowo)); break;
			}
			listBox1.SelectedIndex=listBox1.Items.Count-1;
			listBox2.SelectedIndex=listBox2.Items.Count-1;
		}

		//sprawdzenie czy gra zakonczona
		int[] zliczenia=new int[3];
		int koniec_kod=silnik.CzyKoniec(zliczenia);
		label5.Text=zliczenia[1].ToString();
		label6.Text=zliczenia[2].ToString();
		if (koniec_kod==2) labelMessage.Text="Uwaga! <FONT COLOR=green>Obaj gracze nie mogą wykonać ruchu</FONT>";
		if (koniec_kod>0)
		{
			//informacja o wygranym
			labelMessage.Text="Wygrał gracz "+((zliczenia[1]>zliczenia[2])?"zielony!":"brązowy!");
			table1.Visible=false;
			button2.Visible=true;
			return;
		}

		//sprawdzenie czy kolejny gracz ma mozliwosc ruchu
		if (!silnik.CzyMozliwyRuch())
		{
			labelMessage.Text="Uwaga! <FONT COLOR=green>Gracz "+((silnik.NumerGraczaWykonujacegoNastepnyRuch()==1)?"zielony":"brązowy")+" zmuszony jest do oddania ruchu</FONT>";
			silnik.Pass();
			uzgodnijWygladPlanszy();
			//jezeli komputer, to nie powinno byc return
			//(komputer zawsze brązowy)
			if (!(graPrzeciwkoKomputerowi && silnik.NumerGraczaWykonujacegoNastepnyRuch()==2)) return;
		}

		//Ruch komputera (gracz nr 2)
		if (graPrzeciwkoKomputerowi && silnik.NumerGraczaWykonujacegoNastepnyRuch()==2)
		{
			if (silnik.CzyKoniec(null)==0) ruchKomputera();
		}
	}
	#endregion

	protected void button1_Click(object sender, System.EventArgs e)
	{
		int[] wspolrzedne=silnik.ProponujNajlepszyRuch();
		kliknieciePolaPlanszy(plansza[wspolrzedne[0],wspolrzedne[1]],e);
	}

    protected void button2_Click(object sender, System.EventArgs e)
	{
		//rozpoczecie gry od nowa        
		silnik=new ReversiSilnikAI(); //stary obiekt zostanie automatycznie usuniety
		Session.Add("silnik",silnik);
		listBox1.Items.Clear();
		listBox2.Items.Clear();
		label5.Text="2";
		label6.Text="2";        
		uzgodnijWygladPlanszy();

		button2.Visible=false;
		table1.Visible=true;
        labelMessage.Text = "Nowa gra rozpoczęta o " + DateTime.Now.ToShortTimeString();
	}
}

/*
W grze Reversi gracze zajmują na przemian pola planszy przejmując przy tym wszystkie pola przeciwnika znajdujące się między nowo zajętym polem, a innymi polami gracza wykonującego ruch. Celem gry jest zdobycie większej ilości pól niż przeciwnik.
Gracz może zająć jedynie takie pole, które pozwoli mu przejąć przynajmniej jedno pole przeciwnika. Jeżeli takiego pola nie ma, musi oddać ruch.
Gra kończy się w momencie zajęcia wszystkich pól lub gdy żaden z graczy nie może wykonać ruchu.
*/
