local component = require("component")
local term = require("term")
local unicode = require("unicode")
local event = require("event")
local fs = require("filesystem")
local ecs = require("ECSAPI")
local gpu = component.gpu

------------------------------------------------------------------------------------------------------------------------

local arg = {...}

local crossword = {}
local keyWords = {}
local keyWordsColors = {}

local temporaryWordTrace = {}
local globalWordTrace = {}

------------------------------------------------------------------------------------------------------------------------

local function readFile(path)
	--ЧИТАЕМ И ЗАПОЛНЯЕМ МАССИВ
	local lines = {}
	local f = io.open(path, "r")
	while true do
		local line = f:read("*l")
		if line then
			table.insert(lines, unicode.upper(line))
		else
			break
		end
	end
	f:close()

	return lines
end


local function getCrosswordFromFile(pathToCrossword)

	--ЧИТАЕМ ФАЙЛ КРОССВОРДА
	local readedCrossword = readFile(pathToCrossword)

	--ЕСЛИ ПЕРВАЯ ФРАЗА В ФАЙЛЕ НЕ РАВНА НУЖНОЙ, ТО КИНУТЬ ОШИБКУ, А ТО МАЛО ЛИ
	if readedCrossword[1] ~= "--КРОССВОРД" then ecs.error("Ошибка чтения файла кроссворда: скорее всего, он хуево составлен. Давай заново.") end

	--ПАРСИМ КРОССВОРД НА БУКОВКИ
	local keyWordsStarted = false
	for i = 2, #readedCrossword do
		--ЕСЛИ НАЙДЕНА ФРАЗА НУЖНАЯ, ТО ВКЛЮЧИТЬ РЕЖИМ ЧТЕНИЯ КЛЮЧЕВЫХ СЛОВ
		if readedCrossword[i] == "--КЛЮЧЕВЫЕ СЛОВА" then
			keyWordsStarted = true
		end
		--ВЫБОР МЕЖДУ РЕЖИМАМИ КРОССВОРДА И КЛЮЧЕВЫХ СЛОВ
		if not keyWordsStarted then
			local position = #crossword + 1
			crossword[position] = {}
			for j = 1, unicode.len( readedCrossword[i] ) do
				crossword[position][j] = { unicode.sub(readedCrossword[i], j, j) }
			end
		else
			local yPos = i + 1
			if readedCrossword[yPos] then
				local position = #keyWords + 1
				keyWords[position] = {}
				for j = 1, unicode.len( readedCrossword[yPos] ) do
					table.insert( keyWords[position], unicode.sub(readedCrossword[yPos], j, j) )
				end
			else
				break
			end
		end
	end


end

local function drawCrossword(x, y, background, foreground, xSpaceBetween, ySpaceBetween)

	--ЗАДАНИЕ СТАРТОВЫХ АРГУМЕНТОВ, А ТО МАЛО ЛИ ЧЁ
	x = x or 1
	y = y or 1

	background = background or 0xffffff
	foreground = foreground or 0x000000

	local barsColor = 0xaaaaaa
	local barsTextColor = 0xffffff

	xSpaceBetween = 3
	ySpaceBetween = 1

	--КОРРЕКЦИЯ КООРДИНАТ
	local xPos = x
	local yPos = y

	--РИСУЕМ РЯДЫ
	ecs.square(xPos, yPos, xSpaceBetween + #crossword[1] + xSpaceBetween * #crossword[1] - 1, 1, barsColor)
	ecs.square(xPos, yPos, 2, ySpaceBetween + #crossword + ySpaceBetween * #crossword, barsColor)

	xPos = x + xSpaceBetween + 1
	yPos = yPos + ySpaceBetween + 1

	--РИСУЕМ САМ КРОССВОРД

	for i = 1, #crossword do

		for j = 1, #crossword[i] do
			local cvet1 = background
			local cvet2 = foreground
			if crossword[i][j][2] then
				cvet1 = crossword[i][j][2]
				cvet2 = 0xffffff - cvet1
			end

			gpu.setBackground(cvet1)
			gpu.setForeground(cvet2)

			gpu.set(xPos, yPos, crossword[i][j][1])

			--РИСУЕМ ТЕКСТ НА ПОЛОСОЧКАХ С НОМЕРАМИ
			gpu.setForeground(barsTextColor)
			gpu.setBackground(barsColor)

			gpu.set(xPos, y, tostring(j))
			gpu.set(x, yPos, tostring(i))

			xPos = xPos + xSpaceBetween + 1
			--event.pull("key_down")
		end
		xPos = x + xSpaceBetween + 1
		yPos = yPos + ySpaceBetween + 1
	end

	--СЛОВЕЧКИ РИСУЕМ

	gpu.setBackground(background)
	gpu.setForeground(foreground)

	--ЛИНИЮ РИСУЕМ
	xPos = x + xSpaceBetween
	gpu.set(1, yPos, string.rep("-", 100))
	yPos = yPos + ySpaceBetween + 1

	for i = 1, #keyWords do

		local color1, color2 = background, foreground
		if keyWordsColors[i] then color1 = keyWordsColors[i]; color2 = 0xffffff - color1 end

		local slovo = ""
		for j = 1, #keyWords[i] do
			slovo = slovo .. keyWords[i][j]
		end

		gpu.setBackground(color1)
		gpu.setForeground(color2)

		gpu.set(xPos, yPos, slovo)
		--ecs.error("Слово = "..slovo)

		yPos = yPos + 1
	end
end

local function findWord(x, y, wordCyka, uspeh )	

	if #wordCyka <= 1 then return uspeh end

	local word = {}
	for i = 1, #wordCyka do
		word[i] = wordCyka[i]
	end

	uspeh = false

	table.remove(word, 1)

	--ecs.error("#wordCyka="..#wordCyka..", #word="..#word)

	--ecs.error("Рассматриваю х="..x..", y="..y..", word[1]="..word[1]..", xOtkuda="..xOtkuda..", yOtkuda="..yOtkuda)

	local function cyka(xMod, yMod)
		--ecs.error(word[1] .." ".. crossword[y + yMod][x + xMod][1])
		if word[1] == crossword[y + yMod][x + xMod][1] and not uspeh then
			--ecs.error("Смотрю на ("..x..","..y..","..crossword[y][x][1].."), ищу вокруг букву \""..word[1].."\", #свет="..#temporaryWordTrace)

			uspeh = true
			table.insert(temporaryWordTrace, {xMod, yMod})

			uspeh = findWord( x + xMod, y + yMod, word, uspeh )
		end
	end

	if crossword[y - 1] then cyka(0, -1) end
	if crossword[y][x + 1] then cyka(1, 0) end
	if crossword[y + 1] then cyka(0, 1) end
	if crossword[y][x - 1] then cyka(-1, 0) end

	--УБИРАЕМ ЭЛЕМЕНТИК ИЗ ПОДСВЕТКИ
	if not uspeh then temporaryWordTrace[#temporaryWordTrace] = nil end

	--ecs.error("Успех в конце = "..tostring(uspeh))
	return uspeh
end

local function trace(massivSuda)
	local nomerSlova, x, y, track = massivSuda[1], massivSuda[2], massivSuda[3], massivSuda[4]

	local color = math.random(0x000000, 0xffffff)
	--ecs.error("x="..x..", y="..y)

	keyWordsColors[nomerSlova] = color

	crossword[y][x][2] = color

	for i = 1, #track do
		x = x + track[i][1]
		y = y + track[i][2]

		crossword[y][x][2] = color
	end
end

local function reshitCrossword()
	for ySimvol = 1, #crossword do
		for xSimvol = 1, #crossword[ySimvol] do

			local yKeyWord = 1
			while yKeyWord <= #keyWords do

				--ЕСЛИ ПЕРВАЯ БУКВА КЛЮЧЕВОГО СЛОВА РАВНА СИМВОЛУ РАССМАТРИВАЕМОМУ
				if keyWords[yKeyWord][1] == crossword[ySimvol][xSimvol][1] then

					--ДУБЛИРОВАНИЕ МАССИВА, ПОТОМУШТО ТАК НУЖНО!!! ВОТ
					-- local cyka = {}
					-- for i = 1, #keyWords do
					-- 	cyka[i] = {}
					-- 	for j = 1, #keyWords[i] do
					-- 		cyka[i][j] = keyWords[i][j]
					-- 	end
					-- end

					--table.remove(cyka[yKeyWord], 1)

					--ecs.error("#cyka[yKeyWord] = "..#cyka[yKeyWord]..", #keyWords[yKeyWord] = "..#keyWords[yKeyWord])

					--yKeyWord = 3

					temporaryWordTrace = {}
					--ecs.error("Начинаю поиск слова №"..yKeyWord.." на x = "..xSimvol..", y = "..ySimvol)
					if findWord(xSimvol, ySimvol, keyWords[yKeyWord], true ) then
						

						--ecs.error("УСПЕХ! НАШЛО СЛОВО НОМЕР " .. yKeyWord .. ", его размер="..#keyWords[yKeyWord]..", #свет="..#temporaryWordTrace)

						table.insert(globalWordTrace, {yKeyWord, xSimvol, ySimvol, temporaryWordTrace})

						trace(globalWordTrace[#globalWordTrace])

						--drawCrossword(2, 2, 0xeeeeee, 0x333333, 3, 1)

						yKeyWord = yKeyWord + 1

						--event.pull("key_down")
					end

				end

				yKeyWord = yKeyWord + 1
			end
		end
	end
end


------------------------------------------------------------------------------------------------------------------------

ecs.clearScreen(0x262626)

local vvod = ecs.universalWindow("auto", "auto", 40, 0xeeeeee, true, {"EmptyLine"}, {"CenterText", 0x262626, "Путь к файлу кроссворда"}, {"EmptyLine"}, {"Input", 0x262626, ecs.colors.green, "MineOS/Applications/Crossword.app/Resources/CrosswordFile.txt"}, {"EmptyLine"}, {"Button", {ecs.colors.green, 0xffffff, "OK"}})
local pathToCrossword = vvod[1]
local mode = vvod[2]

ecs.clearScreen(0xeeeeee)
getCrosswordFromFile(pathToCrossword)
drawCrossword(2, 2, 0xeeeeee, 0x333333, 3, 1)
reshitCrossword()

event.pull("key_down")
drawCrossword(2, 2, 0xeeeeee, 0x333333, 3, 1)

os.sleep(1)
event.pull("key_down")
