package net.mitloehner.noughts;

import android.view.View;
import android.widget.Toast;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TableLayout;
import android.widget.TableRow;

public class MyActivity extends Activity
{
    int moves[][];
    int EMPTY = 1, NOUGHT = 2, CROSS = 3;
    ImageView views[][];
    public TableLayout table;
    public boolean haveWinner;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        moves =  new int[3][3];
        views = new ImageView[3][3];
        table = new TableLayout(this);
        setContentView(table);
        initMoves();
        buildTable();
    }

    private void initMoves() {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                moves[i][j] = EMPTY;
            }
        }
    }

    void buildTable() {

        table.removeAllViews();
        for (int i = 0; i < 3; i++) {
            TableRow tr = new TableRow(this);
            tr.setLayoutParams(new TableRow.LayoutParams(
                    TableRow.LayoutParams.FILL_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT));
            for (int j = 0; j < 3; j++) {
                views[i][j] = new ImageView(this);
                viewImg(i, j);
                views[i][j].setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        touched(v);
                    }
                });
                tr.addView(views[i][j]);
            }
            table.addView(tr, new TableLayout.LayoutParams(
                    TableRow.LayoutParams.FILL_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT));
        }
    }

    private void viewImg(int i, int j) {
        if (moves[i][j] == CROSS) views[i][j].setImageResource(R.drawable.cross);
        else if (moves[i][j] == NOUGHT) views[i][j].setImageResource(R.drawable.nought);
        else views[i][j].setImageResource(R.drawable.empty);
    }

    void touched(View v) {
        if (haveWinner) finish();
        else {
            for (int i = 0; i < 3; i++) {
                for (int j = 0; j < 3; j++) {
                    if (v == views[i][j]) {
                        moves[i][j] = CROSS;
                        viewImg(i, j);
                        check();
                        if (!haveWinner) {
                            computer();
                            check();
                        }
                    }
                }
            }
        }
    }

    void computer() {
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (moves[i][j] == EMPTY) {
                    moves[i][j] = NOUGHT;
                    viewImg(i, j);
                    return;
                }
            }
        }
    }
    void check() {
        int i, j;
        // rows
        for (i = 0; i < 3; i++) {
            int m = moves[i][0];
            if (m == EMPTY) break;
            if (moves[i][1] == m && moves[i][2] == m) winner(m);
        }
        // columns
        for (j = 0; j < 3; j++) {
            int m = moves[0][j];
            if (m == EMPTY) break;
            if (moves[1][j] == m && moves[2][j] == m) winner(m);
        }
        // diagonales
        int m = moves[1][1];
        if (m == EMPTY) return;
        if (moves[0][0] == m && moves[2][2] == m) winner(m);
        if (moves[0][2] == m && moves[2][0] == m) winner(m);
        // no winner
    }
    void winner(int who) {
        Toast.makeText(this, "We have a winner!", 2).show();
        haveWinner = true;
    }

}