package parser

import (
	"fmt"
	"strings"
	"unicode"
)

type template func(string, *string, *string, *uint32, *uint32) int

// extractPadFuncFromComment
// line   : string from file with pad config map
// return : pad function string
func extractPadFuncFromComment(line string) string {
	if !strings.Contains(line, "/*") && !strings.Contains(line, "*/") {
		return ""
	}

	fields := strings.Fields(line)
	for i, field := range fields {
		if field == "/*" && len(fields) >= i+2 {
			return fields[i+1]
		}
	}
	return ""
}

// tokenCheck
func tokenCheck(c rune) bool {
	return c != '_' && c != '#' && !unicode.IsLetter(c) && !unicode.IsNumber(c)
}

// useGpioHTemplate
// line      : string from file with pad config map
// *function : the string that means the pad function
// *id       : pad id string
// *dw0      : DW0 register value
// *dw1      : DW1 register value
// return
//   error status
func useInteltoolLogTemplate(line string, function *string,
	id *string, dw0 *uint32, dw1 *uint32) int {

	var val uint64
	// 0x0520: 0x0000003c44000600 GPP_B12  SLP_S0#
	// 0x0438: 0xffffffffffffffff GPP_C7   RESERVED
	if fields := strings.FieldsFunc(line, tokenCheck); len(fields) >= 4 {
		fmt.Sscanf(fields[1], "0x%x", &val)
		*dw0 = uint32(val & 0xffffffff)
		*dw1 = uint32(val >> 32)
		*id = fields[2]
		*function = fields[3]
		// Sometimes the configuration file contains compound functions such as
		// SUSWARN#/SUSPWRDNACK. Since the template does not take this into account,
		// need to collect all parts of the pad function back into a single word
		for i := 4; i < len(fields); i++ {
			*function += "/" + fields[i]
		}
		// clear RO Interrupt Select (INTSEL)
		*dw1 &= 0xffffff00
	}
	return 0
}

// useGpioHTemplate
// line      : string from file with pad config map
// *function : the string that means the pad function
// *id       : pad id string
// *dw0      : DW0 register value
// *dw1      : DW1 register value
// return
//   error status
func useGpioHTemplate(line string, function *string,
	id *string, dw0 *uint32, dw1 *uint32) int {

	// /* RCIN# */	_PAD_CFG_STRUCT(GPP_A0, 0x44000702, 0x00000000),
	// _PAD_CFG_STRUCT(GPP_A0, 0x44000702, 0x00000000), /* RCIN# */
	// _PAD_CFG_STRUCT(GPP_A0, 0x44000702, 0x00000000)
	fields := strings.FieldsFunc(line, tokenCheck)
	for i, field := range fields {
		if field == "_PAD_CFG_STRUCT" {
			if len(fields) < 4 {
				/* the number of definitions does not match the format */
				return -1
			}

			if !strings.Contains(fields[i+2], "0x") || !strings.Contains(fields[i+3], "0x") {
				/* definitions inside the macro do not match the pattern */
				return -1
			}
			*id = fields[i+1]
			fmt.Sscanf(fields[i+2], "0x%x", dw0)
			fmt.Sscanf(fields[i+3], "0x%x", dw1)
			*function = extractPadFuncFromComment(line)
			return 0
		}
	}
	return -1
}

// useYourTemplate
func useYourTemplate(line string, function *string,
	id *string, dw0 *uint32, dw1 *uint32) int {

	// ADD YOUR TEMPLATE HERE
	*function = ""
	*id = ""
	*dw0 = 0
	*dw1 = 0

	fmt.Printf("ADD YOUR TEMPLATE!\n")
	return -1
}

// registerInfoTemplate
// line    : (in)  string from file with pad config map
// *name   : (out) register name
// *offset : (out) offset name
// *value  : (out) register value
// return
//   error status
func registerInfoTemplate(line string, name *string, offset *uint32, value *uint32) int {
	// 0x0088: 0x00ffffff (HOSTSW_OWN_GPP_F)
	// 0x0100: 0x00000000 (GPI_IS_GPP_A)
	if fields := strings.FieldsFunc(line, tokenCheck); len(fields) == 3 {
		*name = fields[2]
		fmt.Sscanf(fields[1], "0x%x", value)
		fmt.Sscanf(fields[0], "0x%x", offset)
		return 0
	}
	return -1
}
