import os
import re
from typing import TextIO
import multiprocessing as mp
import time

def CollateErrors(sourceLocation: str, outputLocation: str) -> None:
	macrosPaths = [f.path for f in os.scandir(sourceLocation) if f.is_dir()]
	processes = [mp.Process(target=CheckMacro, args=(macroPath, outputLocation)) for macroPath in macrosPaths]
	[process.start() for process in processes]
	[process.join() for process in processes]

def CheckMacro(macroPath: str, outputLocation: str) -> None:
	outputTypes = ["logs", "reports"]
	outputSections = ["synthesis", "routing", "placement", "floorplan", "signoff"]
	macroName = os.path.basename(macroPath)

	buildPath = os.path.join(macroPath, "runs", macroName)
	macroOutputPath = os.path.join(outputLocation, macroName)
	if not os.path.exists(macroOutputPath):
		os.mkdir(macroOutputPath)

	errorOutputFilePath = os.path.join(macroOutputPath, "errors.log")
	if os.path.exists(errorOutputFilePath):
		os.remove(errorOutputFilePath)

	warningOutputFilePath = os.path.join(macroOutputPath, "warnings.log")
	if os.path.exists(warningOutputFilePath):
		os.remove(warningOutputFilePath)

	errorCount = 0
	warningCount = 0
	violationCount = 0

	errorOutputFile = None
	warningOutputFile = None

	try:
		errorOutputFile = open(errorOutputFilePath, "a")
		warningOutputFile = open(warningOutputFilePath, "a")

		if os.path.exists(buildPath):
			# Copy errors from file
			errorFilePath = os.path.join(buildPath, "errors.log")
			if os.path.exists(errorFilePath):
				with open(errorFilePath, "r") as f:
					lines = f.readlines()
					errorOutputFile.writelines(lines)
					errorCount += len(lines)

			# Copy warnings from file
			warningFilePath = os.path.join(buildPath, "warnings.log")
			if os.path.exists(warningFilePath):
				with open(warningFilePath, "r") as f:
					lines = f.readlines()
					warningOutputFile.writelines(lines)
					warningCount += len(lines)

			for dir in outputTypes:
				for section in outputSections:
					path = os.path.join(buildPath, dir, section)
					files = [f.path for f in os.scandir(path) if f.is_file() and (f.path.endswith(".log") or f.path.endswith(".rpt"))]

					for file in files:
						e, w, v = CheckFile(file, errorOutputFile, warningOutputFile)
						errorCount += e
						warningCount += w
						violationCount += v

	finally:
		if errorOutputFile is not None:
			errorOutputFile.close()
		if warningOutputFile is not None:
			warningOutputFile.close()

	print(f"Checking macro '{macroName}': ", end="")
	
	if errorCount == 0 and violationCount == 0 and warningCount == 0:
		if os.path.exists(buildPath):
			print("Ok")
		else:
			print("No runs")
	else:
		print("Found issues")
		if errorCount != 0:
			print(f"	\033[91mErrors: {errorCount}\033[0m")
		if violationCount != 0:
			print(f"	\033[91mViolations: {violationCount}\033[0m")
		if warningCount != 0:
			print(f"	\033[93mWarnings: {warningCount}\033[0m")

def CheckFile(fileName: str, errorFile: TextIO, warningFile: TextIO) -> tuple[int, int, int]:
	if not os.path.exists(fileName):
		return 0, 0, 0

	errorCount = 0
	warningCount = 0
	violationCount = 0

	with open(fileName, "r") as f:
		lines = f.readlines()

		for i, line in enumerate(lines):
			if re.search("(?<![_\\-.\\w])(error|errors|mismatch)(?![_\\-.\\w])", line, re.IGNORECASE) is not None or "(no matching " in line or "shorted" in line:
				if "Saving mag view with DRC errors" not in line and "Usage ERROR:" not in line and "CVC: Error output to" not in line and "Checking" not in line and "[InitialPlace]  Iter:" not in line and "No errors found." not in line and "Total errors = 0" not in line and "CVC: Model errors:          0" not in line and "CVC: Error Counts" not in line:
					errorFile.write(f"{fileName}[{i}]: {line.strip()}\n")
					errorCount += 1
			elif re.search("(?<![_\\-.\\w])(violated|violation|violations)(?![_\\-.\\w])", line, re.IGNORECASE) is not None:
				if "No hold violations found." not in line and "Found 0 net violations" not in line and "violation count 0" not in line and "Number of violations = 0" not in line and "violated: 0" not in line and "violations: 0" not in line:
					errorFile.write(f"{fileName}[{i}]: {line.strip()}\n")
					violationCount += 1
			elif "Warning: Calma reading is not undoable!  I hope that's OK." not in line and "already existed before reading GDS!" not in line and "has no liberty cell." not in line and "Parent cell lists instance of" not in line and "Character in instance name converted to underscore." not in line and "is a placeholder, treated as a black box." not in line and "[WARNING GRT-" not in line and "[WARNING TAP-" not in line and "[WARNING ORD-" not in line and "[WARNING STA-" not in line and "[WARNING IFP-" not in line and "[WARNING PSM-" not in line:
				if re.search("(?<![_\\-.\\w])(warning|warnings)(?![_\\-.\\w])", line, re.IGNORECASE) is not None:
					warningFile.write(f"{fileName}[{i}]: {line.strip()}\n")
					warningCount += 1

	return errorCount, warningCount, violationCount

def main():
	CollateErrors("openlane/", "docs/Logs/")

if __name__ == "__main__":
	main()
