#!/usr/bin/python3
import contextlib
import os
import subprocess
import sys
import time

import cv2

LOG_IMAGES = False
SHOW_IMAGE = False


THRESHOLDS = [
	(10, 2),
	(20, 3),
	(30, 5),
	(40, 8),
	(60, 11),
	(70, 13),
	(80, 15),
	(100, 18),
	(110, 20),
	(120, 25),
	(160, 30),
	(190, 50),
	(200, 60),
	(210, 90),
	(220, 100),]


@contextlib.contextmanager
def cv_properties(cap, *props):
	to_reset = []
	try:
		for prop, val in props:
			to_reset.append((prop, cap.get(prop)))
			cap.set(prop, val)

		yield
	finally:
		for prop, val in to_reset:
			if val!=float('inf'):
				cap.set(prop, val)


def get_level(cap):
	success, img = cap.read()
	if not success:
		sys.exit("Failed to acquire image")
	img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

	intensity = cv2.mean(img)[0]
	print("intensity", intensity)

	last_val = 2
	for limit, val in THRESHOLDS:
		if intensity<limit:
			break
		last_val = val
	
	return img, last_val


def main():
	cap = cv2.VideoCapture(0)

	print(cap.get(cv2.CAP_PROP_BRIGHTNESS))
	with cv_properties(cap,
			(cv2.CAP_PROP_BRIGHTNESS, 0.4),
			(cv2.CAP_PROP_AUTO_EXPOSURE, 0.0)):
		cap.set(cv2.CAP_PROP_FRAME_WIDTH, 320)
		cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 240)

		img, old_level = get_level(cap)
		time.sleep(0.5)

		for retry in range(10):
			img, level = get_level(cap)
			if old_level==level:
				break
			old_level = level
			time.sleep(1)

	if LOG_IMAGES:
		import photoshoot
		photoshoot.log_image(img)

	if SHOW_IMAGE:
		cv2.imshow('image',img)
		cv2.waitKey(1000)
		cv2.destroyAllWindows()

	subprocess.check_call(["xbacklight", "-set", str(level)])


if __name__=="__main__":
	main()
