# SPDX-License-Identifier: GPL-2.0

import os
import string

TEMPLATE_DIR = os.path.dirname(os.path.abspath(__file__))
TEST_TEMPLATE_PATH = os.path.join(TEMPLATE_DIR, 'test_template.c')
KCONFIG_TEMPLATE_PATH = os.path.join(TEMPLATE_DIR, 'test_template.Kconfig')
MAKEFILE_TEMPLATE_PATH = os.path.join(TEMPLATE_DIR, 'test_template.Makefile')

def create_skeleton_from_template(template_path, test_prefix, test_object_file):
	with open(template_path, 'r') as f:
		return string.Template(f.read()).safe_substitute(
				test_prefix=test_prefix,
				caps_test_prefix=test_prefix.upper(),
				test_object_file=test_object_file)


class Skeletons(object):
	"""
	Represents the KUnit skeletons for a test, Kconfig entry, and Makefile
	entry.
	"""
	def __init__(self, test_skeleton, kconfig_skeleton, makefile_skeleton):
		self.test_skeleton = test_skeleton
		self.kconfig_skeleton = kconfig_skeleton
		self.makefile_skeleton = makefile_skeleton


def create_skeletons(namespace_prefix, test_object_file):
	test_prefix = namespace_prefix + '_test'
	return Skeletons(
			test_skeleton=create_skeleton_from_template(
					TEST_TEMPLATE_PATH,
					test_prefix,
					test_object_file),
			kconfig_skeleton=create_skeleton_from_template(
					KCONFIG_TEMPLATE_PATH,
					test_prefix,
					test_object_file),
			makefile_skeleton=create_skeleton_from_template(
					MAKEFILE_TEMPLATE_PATH,
					test_prefix,
					test_object_file)
	)

def namespace_prefix_from_path(path):
	file_name = os.path.basename(path)
	return os.path.splitext(file_name)

def create_skeletons_from_path(path, namespace_prefix=None):
	dir_name, file_name = os.path.split(path)
	file_prefix, _ = os.path.splitext(file_name)
	test_path = os.path.join(dir_name, file_prefix + '-test.c')
	test_object_file = file_prefix + '-test.o'
	if not namespace_prefix:
		namespace_prefix = file_prefix.replace('-', '_')
	skeletons = create_skeletons(namespace_prefix, test_object_file)
	print('### In ' + test_path)
	print(skeletons.test_skeleton)
	print('### In Kconfig')
	print(skeletons.kconfig_skeleton)
	print('### In Makefile')
	print(skeletons.makefile_skeleton)

