local tArg = {...}
local filename = tArg[1]

local contrast = 2			-- lower value means higher contrast
local addSpeed = 4			-- higher value means brighter colors show up faster
local subtractSpeed = 1		-- higher value means darker colors take over faster
local minimumStatic = -8	-- lower value means static will be less frequent (not less powerful)
local maximumStatic = 0		-- higher value means static will be more powerful (not less frequent) (if zero, disables static)
local tint = {
	1,
	0.749,
	0,
}

if not fs.exists("windont.lua") then
	print("'windont.lua' not found! Downloading...")
	local net = http.get("https://github.com/LDDestroier/CC/raw/master/windont/windont.lua")
	if net then
		local file = fs.open("windont.lua", "w")
		file.write(net.readAll())
		file.close()
		net.close()
	else
		error("Could not download Windon't.", 0)
	end
end

local windont = require("windont")

windont.useSetVisible = true

local newTerm = windont.newWindow(1, 1, term.getSize())
local gstTerm = windont.newWindow(1, 1, term.getSize())
newTerm.meta.alwaysRender = false
gstTerm.meta.alwaysRender = false

local scr_x, scr_y = term.getSize()

local ghostPalette = {}
local nativePalette = {}

local alpha, rv_alpha 	= {"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"}, {}
local bright, rv_bright = {"f","7","c","a","b","d","9","8","e","5","2","1","6","3","4","0"}, {}
for k,v in pairs(bright) do
	rv_bright[v] = k
end
for k,v in pairs(alpha) do
	rv_alpha[v] = k
end

local setPalette = function(p, t)
	t = t or term.current()
	for i = 0, 15 do
		t.setPaletteColor(2^i, table.unpack(p[2^i]))
	end
end

local makeGhostPalette = function()
	local p
	for i = 0, 15 do
		p = 2 ^ (-1 + rv_alpha[bright[i + 1]])
		ghostPalette[p] = {
			((i + contrast) / (15 + contrast)) * tint[1],
			((i + contrast) / (15 + contrast)) * tint[2],
			((i + contrast) / (15 + contrast)) * tint[3],
		}
		nativePalette[p] = {term.getPaletteColor(p)}
	end
end

makeGhostPalette()
setPalette(ghostPalette)

newTerm.setPaletteColor = function(col, r, g, b)
	return nil
end
newTerm.setPaletteColour = newTerm.setPaletteColor

gstTerm.meta.metaTransformation = function(meta)
	for y = 1, meta.height do
		for x = 1, meta.width do

			local BGCOL = newTerm.meta.buffer[3][y][x]
			local TXCOL
			if newTerm.meta.buffer[1][y][x] == " " then
				TXCOL = BGCOL
			else
				TXCOL = newTerm.meta.buffer[2][y][x]
			end
			local CHAR
			if newTerm.meta.buffer[1][y][x] == " " and meta.buffer[1][y][x] ~= " " then
				CHAR = meta.buffer[1][y][x]
			else
				CHAR = newTerm.meta.buffer[1][y][x]
			end

			meta.buffer[1][y][x] = CHAR

			if rv_bright[TXCOL] >= rv_bright[meta.buffer[2][y][x]] then
				meta.buffer[2][y][x] = bright[ math.min(16, math.min(rv_bright[meta.buffer[2][y][x]] + addSpeed, rv_bright[TXCOL]) + math.max(0, math.random(minimumStatic, maximumStatic))) ]
			else
				meta.buffer[2][y][x] = bright[ math.max(rv_bright[meta.buffer[2][y][x]] - subtractSpeed, 1) ]
			end

			if rv_bright[BGCOL] >= rv_bright[meta.buffer[3][y][x]] then
				meta.buffer[3][y][x] = bright[ math.min(16, math.min(rv_bright[meta.buffer[3][y][x]] + addSpeed, rv_bright[BGCOL]) + math.max(0, math.random(minimumStatic, maximumStatic))) ]
			else
				meta.buffer[3][y][x] = bright[ math.max(rv_bright[meta.buffer[3][y][x]] - subtractSpeed, 1) ]
			end

			if meta.buffer[2][y][x] == "f" and meta.buffer[3][y][x] == "f" and newTerm.meta.buffer[1][y][x] == " " then
				meta.buffer[1][y][x] = " "
			end

		end
	end
end

local oldTerm = term.redirect(newTerm)

local isSelected = true
local multishellID
if multishell then
	multishellID = multishell.getCurrent()
end

parallel.waitForAny(function()
		pcall(function() shell.run(filename or "/rom/programs/shell.lua") end)
	end, function()
	while true do
		if gstTerm.meta.width ~= newTerm.meta.width or gstTerm.meta.height ~= newTerm.meta.height then
			gstTerm.reposition(1, 1, newTerm.meta.width, newTerm.meta.height)
		end
		if multishell then
			if multishellID == multishell.getFocus() then
				if not isSelected then
					setPalette(ghostPalette, term.native())
				end
				isSelected = true
			else
				if isSelected then
					setPalette(nativePalette, term.native())
				end
				isSelected = false
			end
		end
		gstTerm.redraw()
		newTerm.restoreCursor()
		sleep(0)
	end
end)

term.redirect(oldTerm)
setPalette(nativePalette)
newTerm.redraw()
term.setCursorPos(1, scr_y)
