const MAGIC = 0x7f5a08f5

export interface TemplateString {
  __magic: number
  strings: TemplateStringsArray
  variables: string[]
}

export function t(strings: TemplateStringsArray, ...variables: string[]): TemplateString {
  return { __magic: MAGIC, strings: strings, variables: variables }
}

export function isTemplate(template: any): boolean {
  return template !== null && typeof template === 'object' && template.__magic === MAGIC
}

export function expandTemplate(template: TemplateString, content: any): string {
  const values = template.variables.map(path =>
    path.split('.').reduce((acc, key) => {
      if (acc && typeof acc === 'object' && key in acc) {
        return acc[key]
      }

      return undefined
    }, content)
  )

  let result = ''

  for (let i = 0; i < template.strings.length; i++) {
    result += template.strings[i]

    if (i < values.length) {
      result += values[i] ?? `\${${template.variables[i]}}`
    }
  }

  return result
}
