from sanic.log import logger, logging
from logging import LogRecord
from config import *

METRICS_REQ_NO = 0
METRICS_ERR_NO = 0 # Errors served to the clients
METRICS_PRETIX_READ = 0
METRICS_PRETIX_WRITE = 0
METRICS_PRETIX_ERRORS = 0 # Errors requesting pretix's backend

def incPretixRead():
	global METRICS_PRETIX_READ
	METRICS_PRETIX_READ += 1

def incPretixWrite():
	global METRICS_PRETIX_WRITE
	METRICS_PRETIX_WRITE += 1

def incPretixErrors():
	global METRICS_PRETIX_ERRORS
	METRICS_PRETIX_ERRORS += 1

def incReqNo():
	global METRICS_REQ_NO
	METRICS_REQ_NO += 1

def incErrorNo(): # Errors served to the clients
	global METRICS_ERR_NO
	METRICS_ERR_NO += 1


def getMetricsText():
	global METRICS_REQ_NO
	global METRICS_ERR_NO
	global METRICS_PRETIX_READ
	global METRICS_PRETIX_WRITE
	global METRICS_PRETIX_ERRORS
	out = []

	out.append(f'sanic_request_count{{}} {METRICS_REQ_NO}')
	out.append(f'sanic_error_count{{}} {METRICS_ERR_NO}')
	out.append(f'webint_pretix_read_count{{}} {METRICS_PRETIX_READ}')
	out.append(f'webint_pretix_write_count{{}} {METRICS_PRETIX_WRITE}')
	out.append(f'webint_pretix_error_count{{}} {METRICS_PRETIX_ERRORS}')

	return "\n".join(out)

def getRoomCountersText(request):
	out = []
	try :
		daily = 0
		counters = {}
		for id in ROOM_TYPE_NAMES.keys():
			counters[id] = 0

		for order in request.app.ctx.om.cache.values():
			if(order.daily):
				daily += 1
			else:
				counters[order.bed_in_room] += 1

		for id, count in counters.items():
			out.append(f'webint_order_room_counter{{label="{ROOM_TYPE_NAMES[id]}"}} {count}')
		out.append(f'webint_order_room_counter{{label="Daily"}} {daily}')

	except Exception as e:
		print(e)
		logger.warning("Error in loading metrics rooms")
	return "\n".join(out)

class MetricsFilter(logging.Filter):
	def filter(self, record : LogRecord):
		return not (record.request.endswith("/manage/metrics") and record.status == 200)