package main

import (
	"time"

	"github.com/gdamore/tcell/v2"
)

type Game struct {
	Screen tcell.Screen
	Cells [][]Cell
}

func (g *Game) Run() Game{
	s := g.Screen
	style := tcell.StyleDefault.Background(tcell.ColorBlack).Foreground(tcell.ColorPurple)
	s.SetStyle(style)

	state := g.Cells
	var newState [][]Cell
	for r, h := range state {
		var row []Cell
		for c, _ := range h {
			cellState := state[r][c].Update(g)	
			cellX := r
			cellY := c
			newCell := Cell{
				X: cellX,
				Y: cellY,
				State: cellState,
			}
			row = append(row, newCell)
			s.SetContent(state[r][c].X, state[r][c].Y, state[r][c].Display(), nil, style)
		}
		newState = append(newState, row)
	}
	newGame := Game {
		Screen: s,
		Cells: newState,
	}
	s.Show()
	time.Sleep(1*time.Millisecond)
	s.Clear()
	return newGame
}

func (g *Game) Glider() Game{
	s := g.Screen
	h, w := s.Size()
	var states [][]int
	for r := 0; r<h; r++ {
		var row []int
		for c := 0; c<w; c++ {
			n := 0
			row = append(row, n)
		}
		states = append(states, row)
	}
	states[111][26] = 1
	states[112][27] = 1
	states[113][27] = 1
	states[113][26] = 1
	states[113][25] = 1

	var cells [][]Cell
	for r := 0; r<h; r++ {
		var row []Cell
		for c := 0; c<w; c++ {
			newCell := Cell{r, c, states[r][c]}
			row = append(row, newCell)
		}
		cells = append(cells, row)
	}

	game := Game{
		Screen: s,
		Cells: cells,
	}
	return game
}

func (g *Game) GliderGun() Game{
	s := g.Screen
	h, w := s.Size()
	var states [][]int
	for r := 0; r<h; r++ {
		var row []int
		for c := 0; c<w; c++ {
			n := 0
			row = append(row, n)
		}
		states = append(states, row)
	}
	states[111][26] = 1
	states[112][27] = 1
	states[113][26] = 1
	states[113][27] = 1
	states[122][26] = 1
	states[122][27] = 1
	states[122][28] = 1
	states[123][25] = 1
	states[123][29] = 1
	states[124][24] = 1
	states[124][30] = 1
	states[125][24] = 1
	states[125][30] = 1
	states[126][27] = 1
	states[127][25] = 1
	states[127][29] = 1
	states[128][26] = 1
	states[128][27] = 1
	states[128][28] = 1
	states[129][27] = 1
	states[131][24] = 1
	states[131][25] = 1
	states[131][26] = 1
	states[132][24] = 1
	states[132][25] = 1
	states[132][26] = 1
	states[133][23] = 1
	states[133][27] = 1
	states[135][22] = 1
	states[135][23] = 1
	states[135][27] = 1
	states[135][28] = 1
	states[145][24] = 1
	states[145][25] = 1
	states[146][24] = 1
	states[146][25] = 1
	
	var cells [][]Cell
	for r := 0; r<h; r++ {
		var row []Cell
		for c := 0; c<w; c++ {
			newCell := Cell{r, c, states[r][c]}
			row = append(row, newCell)
		}
		cells = append(cells, row)
	}

	game := Game{
		Screen: s,
		Cells: cells,
	}
	return game
}
