#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0
#
# Utilities for printing and coloring output.
#
# Copyright (C) 2022, Google LLC.
# Author: Daniel Latypov <dlatypov@google.com>

import datetime
import sys
import typing

_RESET = '\033[0;0m'

class Printer:
	"""Wraps a file object, providing utilities for coloring output, etc."""

	def __init__(self, output: typing.IO):
		self._output = output
		self._use_color = output.isatty()

	def print(self, message: str) -> None:
		print(message, file=self._output)

	def print_with_timestamp(self, message: str) -> None:
		ts = datetime.datetime.now().strftime('%H:%M:%S')
		self.print(f'[{ts}] {message}')

	def _color(self, code: str, text: str) -> str:
		if not self._use_color:
			return text
		return code + text + _RESET

	def red(self, text: str) -> str:
		return self._color('\033[1;31m', text)

	def yellow(self, text: str) -> str:
		return self._color('\033[1;33m', text)

	def green(self, text: str) -> str:
		return self._color('\033[1;32m', text)

	def color_len(self) -> int:
		"""Returns the length of the color escape codes."""
		return len(self.red(''))

# Provides a default instance that prints to stdout
stdout = Printer(sys.stdout)
