# Copyright 2005-2012 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

import portage
from portage import os
from portage.const import PRIVATE_PATH
from portage.util import grabdict, writedict

class CleanConfig(object):

	short_desc = "Discard any no longer installed configs from emerge's tracker list"

	def __init__(self):
		self._root = portage.settings["ROOT"]
		self.target = os.path.join(portage.settings["EROOT"], PRIVATE_PATH, 'config')

	def name():
		return "cleanconfmem"
	name = staticmethod(name)

	def load_configlist(self):
		return grabdict(self.target)

	def check(self,  **kwargs):
		onProgress = kwargs.get('onProgress', None)
		configs = self.load_configlist()
		messages = []
		maxval = len(configs)
		if onProgress:
			onProgress(maxval, 0)
			i = 0
		keys = sorted(configs)
		for config in keys:
			if not os.path.exists(config):
				messages.append("  %s" % config)
			if onProgress:
				onProgress(maxval, i+1)
				i += 1
		return self._format_output(messages)

	def fix(self, **kwargs):
		onProgress = kwargs.get('onProgress', None)
		configs = self.load_configlist()
		messages = []
		maxval = len(configs)
		if onProgress:
			onProgress(maxval, 0)
			i = 0

		root = self._root
		if root == "/":
			root = None
		modified = False
		for config in sorted(configs):
			if root is None:
				full_path = config
			else:
				full_path = os.path.join(root, config.lstrip(os.sep))
			if not os.path.exists(full_path):
				modified = True
				configs.pop(config)
				messages.append("  %s" % config)
			if onProgress:
				onProgress(maxval, i+1)
				i += 1
		if modified:
			writedict(configs, self.target)
		return self._format_output(messages, True)

	def _format_output(self, messages=[], cleaned=False):
		output = []
		if messages:
			output.append('Not Installed:')
			output += messages
			tot = '------------------------------------\n  Total %i Not installed'
			if cleaned:
				tot += ' ...Cleaned'
			output.append(tot  % len(messages))
		return output
