------------------------------------------------------------
--- cc-get version 0.1.1
--- Created by DJRanger
---
--- This is very experimental, use at your own risk
--- Install:
---   Put this script and the cc-get-bin folder into your
---   .minecraft/mods/ComputerCraft/lua/rom/programs/ folder
---
------------------------------------------------------------

VERSION = '0.1.1'

if http == nil then
	print('Please enable the http api.')
	print('Look for enableAPI_http=0 in .minecraft/config/ and change the zero to a one and then restart Minecraft')
	return false
end
json = (loadfile("/mem/redworks/programs/cc-get-bin/dkjson.lua")())
shell.run('cc-get-bin/params.lua')
shell.run('cc-get-bin/package.lua')

params = parse_params({...}, {version = '-v *([^ ]+)'})

urlBase = 'http://cc-get.djranger.com/cc/' .. VERSION .. '/'
local action = params[1]

if not fs.exists('/bin') then
	fs.makeDir('/bin')
	fs.makeDir('/bin/lib')
end

if fs.exists('/bin/packages.json') then
	fs.makeDir('/bin/lib');
	fs.move('/bin/packages.json', '/bin/lib/packages.json')
end

if not fs.exists('/bin/lib/packages.json') then
	file = fs.open('/bin/lib/packages.json', 'w')
	file.write('{"packages": {}, "installed": 0}')
	file.close()
end

local file = fs.open('/bin/lib/packages.json', 'r')
data = json.decode(file:readAll())
file:close()

function save_data()
	file = fs.open('/bin/lib/packages.json', 'w')
	file.write(json.encode(data))
	file.close()
end

if not action then
	-- No params, show some info about the program
	shell.run('help', 'cc-get')
elseif action == 'install' or action == 'remove' then
	name = params[2]
	if not name then
		print('Usage: cc-get ' .. action .. ' <program>')
	
	elseif action == 'install' then
		local status, package = Package.get(name, params.version)
		if status then
			local version = ''
			if params.version then
				version = ' version ' .. package.version
			end
			term.write('Really install ' .. name .. version .. '? y/n: ')
			answer = read()
			
			if answer:sub(0,1) == 'y' then
				status = package:install()
				if status == true then
					package.source = nil
					data.packages[ package.name ] = package
					print( package.name ..' version ' .. package.version .. ' installed' )
				else
					pritn('Something went wrong installing ' .. package.name)
				end
			end
		else
			print(package)
		end
	elseif action == 'remove' then
		local status, package = Package.load( name )
		if status then
			term.write('Really remove the package ' .. name .. '? y/n: ')
			answer = read()
			if answer:sub(0,1) == 'y' then
				package:uninstall()
				print('The ' .. package.name .. ' package has been removed')
			end
		else
			print(package)
		end
	end
	
elseif action == 'update' then
	local qs = ''
	for name, info in pairs(data.packages) do
		qs = qs .. name .. ','
	end
	
	qs = qs:sub(0, -2)
	
	result = json.decode( http.get(urlBase .. 'info/' .. qs).readAll() )
	local updates = 0
	
	for name, info in pairs(result) do
		if data.packages[ name ].timestamp < info.timestamp then
			-- Need to update
			print('Updating ' .. name .. ' from version ' .. data.packages[ name ].version .. ' to version ' .. info.version .. '...')
			status, package = Package.load(name)
			package:update()
			print( package.name .. ' updated ')
			updates = updates + 1
		end
	end
	
	if updates == 0 then
		print('Nothing needs to be updated')
	end
elseif action == 'list' then
	local i = 0
	for name, info in pairs(data.packages) do
		print( name .. ' version ' .. info.version )
		i = i + 1
	end
	
	if i == 0 then
		print('No packages installed')
	end

else
	print('Unknown command "' .. action .. '"')
end

save_data()