#!/bin/bash
# First check that Leo is installed.
if ! command -v leo &> /dev/null
then
    echo "leo is not installed."
    exit
fi

echo "
Let's play a game of tic tac toe.

We generate the board, and then the player take turns executing the transition function make_move.

The inputs to the function are the player number, row position, column position, and the previous state of the board.

The output provided is the new state of the board and an evaluation of who won the game. 0u8 as the evaluation output means a draw if the board is complete or that the game is not yet over.
"

echo "
Create a new game.

leo run new
"

leo run new

echo "
###############################################################################
########                                                               ########
########          STEP 0: Creating a new game of Tic-Tac-Toe           ########
########                                                               ########
########                         |   |   |   |                         ########
########                         |   |   |   |                         ########
########                         |   |   |   |                         ########
########                                                               ########
###############################################################################
"

echo "
Have Player 1 make the first move.

leo run make_move 1u8 1u8 1u8 '{ r1: { c1: 0u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 0u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }'
"

leo run make_move 1u8 1u8 1u8 "{ r1: { c1: 0u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 0u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }"

echo "
###############################################################################
########                                                               ########
########             STEP 1: Player 1 makes the 1st move.              ########
########                                                               ########
########                         | x |   |   |                         ########
########                         |   |   |   |                         ########
########                         |   |   |   |                         ########
########                                                               ########
###############################################################################
"

echo "
Have Player 2 make the second move.

leo run make_move 2u8 2u8 2u8 '{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 0u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }'
"

leo run make_move 2u8 2u8 2u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 0u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }"

echo "
###############################################################################
########                                                               ########
########             STEP 2: Player 2 makes the 2nd move.              ########
########                                                               ########
########                         | x |   |   |                         ########
########                         |   | o |   |                         ########
########                         |   |   |   |                         ########
########                                                               ########
###############################################################################
"

echo "
Have Player 1 make the third move.

leo run make_move 1u8 3u8 1u8 '{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 2u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }'
"

leo run make_move 1u8 3u8 1u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 2u8, c3: 0u8 }, r3: { c1: 0u8, c2: 0u8, c3: 0u8 } }"

echo "
###############################################################################
########                                                               ########
########             STEP 3: Player 1 makes the 3rd move.              ########
########                                                               ########
########                         | x |   |   |                         ########
########                         |   | o |   |                         ########
########                         | x |   |   |                         ########
########                                                               ########
###############################################################################
"

echo "
Have Player 2 make the fourth move.

leo run make_move 2u8 2u8 1u8 '{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 2u8, c3: 0u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }'
"

leo run make_move 2u8 2u8 1u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 0u8, c2: 2u8, c3: 0u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }"

echo "
###############################################################################
########                                                               ########
########             STEP 4: Player 2 makes the 4th move.              ########
########                                                               ########
########                         | x |   |   |                         ########
########                         | o | o |   |                         ########
########                         | x |   |   |                         ########
########                                                               ########
###############################################################################
"

echo "
Have Player 1 make the fifth move.

leo run make_move 1u8 2u8 3u8 '{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 0u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }'
"

leo run make_move 1u8 2u8 3u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 0u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }"

echo "
###############################################################################
########                                                               ########
########             STEP 5: Player 1 makes the 5th move.              ########
########                                                               ########
########                         | x |   |   |                         ########
########                         | o | o | x |                         ########
########                         | x |   |   |                         ########
########                                                               ########
###############################################################################
"

echo "
Have Player 2 make the sixth move.

leo run make_move 2u8 1u8 2u8 '{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }'
"

leo run make_move 2u8 1u8 2u8 "{ r1: { c1: 1u8, c2: 0u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }"

echo "
###############################################################################
########                                                               ########
########             STEP 6: Player 2 makes the 6th move.              ########
########                                                               ########
########                         | x | o |   |                         ########
########                         | o | o | x |                         ########
########                         | x |   |   |                         ########
########                                                               ########
###############################################################################
"

echo "
Have Player 1 make the seventh move.

leo run make_move 1u8 3u8 2u8 '{ r1: { c1: 1u8, c2: 2u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }'
"

leo run make_move 1u8 3u8 2u8 "{ r1: { c1: 1u8, c2: 2u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 0u8, c3: 0u8 } }"

echo "
###############################################################################
########                                                               ########
########             STEP 7: Player 1 makes the 7th move.              ########
########                                                               ########
########                         | x | o |   |                         ########
########                         | o | o | x |                         ########
########                         | x | x |   |                         ########
########                                                               ########
###############################################################################
"


echo "
Have Player 2 make the eighth move.

leo run make_move 2u8 3u8 3u8 '{ r1: { c1: 1u8, c2: 2u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 1u8, c3: 0u8 } }'
"

leo run make_move 2u8 3u8 3u8 "{ r1: { c1: 1u8, c2: 2u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 1u8, c3: 0u8 } }"

echo "
###############################################################################
########                                                               ########
########             STEP 8: Player 2 makes the 8th move.              ########
########                                                               ########
########                         | x | o |   |                         ########
########                         | o | o | x |                         ########
########                         | x | x | o |                         ########
########                                                               ########
###############################################################################
"

echo "
Have Player 1 make the ninth move.

leo run make_move 1u8 1u8 3u8 '{ r1: { c1: 1u8, c2: 2u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 1u8, c3: 2u8 } }'
"

leo run make_move 1u8 1u8 3u8 "{ r1: { c1: 1u8, c2: 2u8, c3: 0u8 }, r2: { c1: 2u8, c2: 2u8, c3: 1u8 }, r3: { c1: 1u8, c2: 1u8, c3: 2u8 } }"

echo "
###############################################################################
########                                                               ########
########             STEP 9: Player 1 makes the 9th move.              ########
########                                                               ########
########                         | x | o | x |                         ########
########                         | o | o | x |                         ########
########                         | x | x | o |                         ########
########                                                               ########
###############################################################################
"

echo "
Output is still 0u8 at the end. Draw!

###############################################################################
########                                                               ########
########               Game Complete! Players 1 & 2 Tied               ########
########                                                               ########
########                         | x | o | x |                         ########
########                         | o | o | x |                         ########
########                         | x | x | o |                         ########
########                                                               ########
###############################################################################
"
