# 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, print_test_only=False):
	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)
	if print_test_only:
		return
	print('### In Kconfig')
	print(skeletons.kconfig_skeleton)
	print('### In Makefile')
	print(skeletons.makefile_skeleton)

