//  File tictactoe.cpp

#include <iostream>
#include <GL/sgl.h>
#include "ttt_logic.h"

using namespace sgl;

class TTTBoard: public Window
{
protected:
    int status;

    int point_to_square(double x, double y) const
    {
        int result = NO_POSITION;
        if ( x < 200.0 && y > 400.0 )
            result = NORTHWEST;
        else if ( x > 200.0 && x < 400.0 && y > 400.0 )
            result = NORTH;
        else if ( x > 400.0 && y > 400.0 )
            result = NORTHEAST;
        else if ( x > 400.0 && y < 400.0 && y > 200.0 )
            result = EAST;
        else if ( x > 400.0 && y < 200.0 )
            result = SOUTHEAST;
        else if ( x > 200.0 && x < 400.0 && y < 200.0 )
            result = SOUTH;
        else if ( x < 200.0 && y < 200.0 )
            result = SOUTHWEST;
        else if ( x < 200.0 && y < 400.0 && y > 200.0 )
            result = WEST;
        else if ( x < 400.0 && x > 2.00 && y < 400.0 && y > 200.0 )
            result = CENTER;
        return result;
    }

    Point square_to_point(int square) const
    {
        Point result(0.0, 0.0);
        switch ( square )
        {
        case NORTHWEST:
            result = Point(100.0, 500.0); break;
        case NORTH:
            result = Point(300.0, 500.0); break;
        case NORTHEAST:
            result = Point(500.0, 500.0); break;
        case EAST:
            result = Point(500.0, 300.0); break;
        case SOUTHEAST:
            result = Point(500.0, 100.0); break;
        case SOUTH:
            result = Point(300.0, 100.0); break;
        case SOUTHWEST:
            result = Point(100.0, 100.0); break;
        case WEST:
            result = Point(100.0, 300.0); break;
        case CENTER:
            result = Point(300.0, 300.0); break;
        }
        return result;
    }


    void draw_cross(const Point& p) const
    {
        set_color(BLUE);
        draw_line(p.x - 90.0, p.y - 90.0,
                  p.x + 90.0, p.y + 90.0);
        draw_line(p.x - 90.0, p.y + 90.0,
                  p.x + 90.0, p.y - 90.0);

    }

    void draw_nought(const Point& p)
    {
        set_color(RED);
        draw_circle(p.x, p.y, 90.0);
    }

public:
    TTTBoard(): Window("Tic Tac Toe", 100, 100, 400, 400,
                       0.0, 600.0, 0.0, 600.0), 
                status(PLAYING) {}

    void paint()
    {
        set_color(BLACK);
        set_line_width(3);
        //  Draw board grid
        draw_line(200.0, 0.0, 200.0, 600.0);
        draw_line(400.0, 0.0, 400.0, 600.0);
        draw_line(0.0, 200.0, 600.0, 200.0);
        draw_line(0.0, 400.0, 600.0, 400.0);
        set_line_width(8);
        //  Draw contents of board
        for ( int i = 0; i < 9; i++ )
        {
            Point pt = square_to_point(i);
            switch ( look(i) )
            {
            case CROSS:
                draw_cross(pt);
                break;
            case NOUGHT:
                draw_nought(pt);
                break;
            }
        }
        if ( status != PLAYING )
            set_color(BLACK);
            switch ( status )
            {
            case WIN_NW_NE:
                draw_line(0.0, 500.0, 600.0, 500.0);
                break;
            case WIN_W_E:
                draw_line(0.0, 300.0, 600.0, 300.0);
                break;
            case WIN_SW_SE:
                draw_line(0.0, 100.0, 600.0, 100.0);
                break;
            case WIN_NW_SW:
                draw_line(100.0, 0.0, 100.0, 600.0);
                break;
            case WIN_N_S:
                draw_line(300.0, 600.0, 300.0, 0.0);
                break;
            case WIN_NE_SE:
                draw_line(500.0, 600.0, 500.0, 0.0);
                break;
            case WIN_NW_SE:
                draw_line(0.0, 600.0, 600.0, 0.0);
                break;
            case WIN_NE_SW:
                draw_line(600.0, 600.0, 0.0, 0.0);
                break;
            case DRAW:
                draw_line(0.0, 500.0, 600.0, 500.0);
                draw_line(0.0, 300.0, 600.0, 300.0);
                draw_line(0.0, 100.0, 600.0, 100.0);
                draw_line(100.0, 0.0, 100.0, 600.0);
                draw_line(300.0, 600.0, 300.0, 0.0);
                draw_line(500.0, 600.0, 500.0, 0.0);
                draw_line(0.0, 600.0, 600.0, 0.0);
                draw_line(600.0, 600.0, 0.0, 0.0);
                break;
            }
    }

    void mouse_pressed(double x, double y, MouseButton b)
    {
        if ( status == PLAYING )
            move(point_to_square(x, y));
        else   //  Ready to play another game
            clear_board();   //  Empty the board
        status = check_status();  //  Update status
        repaint();
        Window::mouse_pressed(x, y, b);
    }
};

int main()
{
    (new TTTBoard)->run();
}
