<gh_stars>1-10
from otree.api import Currency as c, currency_range
from ._builtin import Page, WaitPage
from .models import Constants

class Welcome(Page):
	pass


class CategoryElicitation(Page):
	form_model = "player"
	form_fields = [
		'cat_end_rel_1', 
		'cat_end_rel_2', 
		'cat_end_rel_3',
		'cat_end_rel_4',
		'cat_end_rel_5',

		'cat_end_abs_1', 
		'cat_end_abs_2', 
		'cat_end_abs_3',
		'cat_end_abs_4',
		'cat_end_abs_5',
	]


class Instructions1(Page):
	form_model = "player"
	form_fields = ["question_1", "question_2"]

	def question_1_error_message(self, value):
		if value == "Falsch":
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."

	def question_2_error_message(self, value):
		if value == "Richtig":
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."

class Instructions2(Page):
	form_model = "player"
	form_fields = ["question_3", "question_4"]

	def question_3_error_message(self, value):
		if value != 20:
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."

	def question_4_error_message(self, value):
		if value != 4:
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."


class Instructions3(Page):
	form_model = "player"
	form_fields = ["question_5", "question_6"]

	def question_5_error_message(self, value):
		if value == "Richtig":
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."

	def question_6_error_message(self, value):
		if value == "Richtig":
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."


class CategoryPick(Page):
	form_model = "player"
	form_fields = ["category"]

	def vars_for_template(self):
		return {
			'width_a': self.player.cat_end_abs_1,
			'width_b': self.player.cat_end_abs_2 - self.player.cat_end_abs_1,
			'width_c': self.player.cat_end_abs_3 - self.player.cat_end_abs_2,
			'width_d': self.player.cat_end_abs_4 - self.player.cat_end_abs_3,
			'width_e': self.player.cat_end_abs_5 - self.player.cat_end_abs_4,
		}


class CategoryWaitPage(WaitPage):
	wait_for_all_groups = True

	def after_all_players_arrive(self):
		self.subsession.set_groups()
		# weil wait_for_all_groups gesetzt ist, wird die Funktion nur einmal aufgerufen,
		# folglich muss ich dann noch eine Ebene über die Gruppe hinaus auf die Subsession
		# in der aufgerufenen Funktion auf der Subsession-Ebene wird dann durch alle Gruppen gegangen
		# und da dann jeweils durch jeden Spieler um die Category zu kommunizieren.
		self.subsession.communicate_categories()


class Agent(Page):
	form_model = "player"
	form_fields = ["decision_for_p1"]

	def vars_for_template(self):
		return {
			'p1_category': self.player.category_from_principal,

			'width_a': self.player.cat_end_abs_1,
			'width_b': self.player.cat_end_abs_2 - self.player.cat_end_abs_1,
			'width_c': self.player.cat_end_abs_3 - self.player.cat_end_abs_2,
			'width_d': self.player.cat_end_abs_4 - self.player.cat_end_abs_3,
			'width_e': self.player.cat_end_abs_5 - self.player.cat_end_abs_4,
		}

class WaitForAgents(WaitPage):
	def after_all_players_arrive(self):
		self.group.after_investments()


class Results_Principals(Page):	
	def is_displayed(self):
		return self.player.role() == "Principal"

	form_model = "player"
	form_fields = ["message"]


class WaitForPrincipals(WaitPage):
	def after_all_players_arrive(self):
		self.group.after_results_principals()


class Results_Agents(Page):
	def is_displayed(self):
		return self.player.role() == "Agent"


class Questionnaire(Page):
	form_model = "player"
	form_fields = ["age", "gender", "studies", "nonstudent", "financial_advice", "income"]

	# This works now, but is not in compliance with the oTree manual.. I guess we found a bug.
	# returns an error message if a participant...
	def error_message(self, values):
		# ... indicates field of studies and ticks the box "non-student".
		if values["studies"]:
			if values["nonstudent"]:
				return "Bitte geben Sie entweder ein Studienfach an oder wählen Sie \"Kein Student\""
		# ... states no field of studies and and does not tick the box.
		else:
		#elif "studies" not in values:
			if not values["nonstudent"]:
				return "Sie haben kein Studienfach angegeben. Wenn Sie kein Student sind, treffen Sie bitte eine entsprechende Auswahl."

class Last_Page(Page):
	pass



page_sequence = [
	Welcome,
	CategoryElicitation,
	Instructions1,
	Instructions2,
	Instructions3,
	CategoryPick,
	CategoryWaitPage,
	Agent,
	WaitForAgents,
	Results_Principals,
	WaitForPrincipals,
	Results_Agents,
	Questionnaire,
	Last_Page
]

from otree.api import Currency as c, currency_range
from ._builtin import Page, WaitPage
from .models import Constants

class Welcome(Page):
	pass


class CategoryElicitation(Page):
	form_model = "player"
	form_fields = [
		'cat_end_rel_1', 
		'cat_end_rel_2', 
		'cat_end_rel_3',
		'cat_end_rel_4',
		'cat_end_rel_5',

		'cat_end_abs_1', 
		'cat_end_abs_2', 
		'cat_end_abs_3',
		'cat_end_abs_4',
		'cat_end_abs_5',
	]


class Instructions1(Page):
	form_model = "player"
	form_fields = ["question_1", "question_2"]

	def question_1_error_message(self, value):
		if value == "Falsch":
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."

	def question_2_error_message(self, value):
		if value == "Richtig":
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."

class Instructions2(Page):
	form_model = "player"
	form_fields = ["question_3", "question_4"]

	def question_3_error_message(self, value):
		if value != 20:
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."

	def question_4_error_message(self, value):
		if value != 4:
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."


class Instructions3(Page):
	form_model = "player"
	form_fields = ["question_5", "question_6"]

	def question_5_error_message(self, value):
		if value == "Richtig":
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."

	def question_6_error_message(self, value):
		if value == "Richtig":
			return "Bitte lesen Sie die Instruktionen erneut genau durch und korrigieren Sie Ihre Antwort."


class CategoryPick(Page):
	form_model = "player"
	form_fields = ["category"]

	def vars_for_template(self):
		return {
			'width_a': self.player.cat_end_abs_1,
			'width_b': self.player.cat_end_abs_2 - self.player.cat_end_abs_1,
			'width_c': self.player.cat_end_abs_3 - self.player.cat_end_abs_2,
			'width_d': self.player.cat_end_abs_4 - self.player.cat_end_abs_3,
			'width_e': self.player.cat_end_abs_5 - self.player.cat_end_abs_4,
		}


class CategoryWaitPage(WaitPage):
	wait_for_all_groups = True

	def after_all_players_arrive(self):
		self.subsession.set_groups()
		# weil wait_for_all_groups gesetzt ist, wird die Funktion nur einmal aufgerufen,
		# folglich muss ich dann noch eine Ebene über die Gruppe hinaus auf die Subsession
		# in der aufgerufenen Funktion auf der Subsession-Ebene wird dann durch alle Gruppen gegangen
		# und da dann jeweils durch jeden Spieler um die Category zu kommunizieren.
		self.subsession.communicate_categories()


class Agent(Page):
	form_model = "player"
	form_fields = ["decision_for_p1"]

	def vars_for_template(self):
		return {
			'p1_category': self.player.category_from_principal,

			'width_a': self.player.cat_end_abs_1,
			'width_b': self.player.cat_end_abs_2 - self.player.cat_end_abs_1,
			'width_c': self.player.cat_end_abs_3 - self.player.cat_end_abs_2,
			'width_d': self.player.cat_end_abs_4 - self.player.cat_end_abs_3,
			'width_e': self.player.cat_end_abs_5 - self.player.cat_end_abs_4,
		}

class WaitForAgents(WaitPage):
	def after_all_players_arrive(self):
		self.group.after_investments()


class Results_Principals(Page):	
	def is_displayed(self):
		return self.player.role() == "Principal"

	form_model = "player"
	form_fields = ["message"]


class WaitForPrincipals(WaitPage):
	def after_all_players_arrive(self):
		self.group.after_results_principals()


class Results_Agents(Page):
	def is_displayed(self):
		return self.player.role() == "Agent"


class Questionnaire(Page):
	form_model = "player"
	form_fields = ["age", "gender", "studies", "nonstudent", "financial_advice", "income"]

	# This works now, but is not in compliance with the oTree manual.. I guess we found a bug.
	# returns an error message if a participant...
	def error_message(self, values):
		# ... indicates field of studies and ticks the box "non-student".
		if values["studies"]:
			if values["nonstudent"]:
				return "Bitte geben Sie entweder ein Studienfach an oder wählen Sie \"Kein Student\""
		# ... states no field of studies and and does not tick the box.
		else:
		#elif "studies" not in values:
			if not values["nonstudent"]:
				return "Sie haben kein Studienfach angegeben. Wenn Sie kein Student sind, treffen Sie bitte eine entsprechende Auswahl."

class Last_Page(Page):
	pass



page_sequence = [
	Welcome,
	CategoryElicitation,
	Instructions1,
	Instructions2,
	Instructions3,
	CategoryPick,
	CategoryWaitPage,
	Agent,
	WaitForAgents,
	Results_Principals,
	WaitForPrincipals,
	Results_Agents,
	Questionnaire,
	Last_Page
]
# weil wait_for_all_groups gesetzt ist, wird die Funktion nur einmal aufgerufen, # folglich muss ich dann noch eine Ebene über die Gruppe hinaus auf die Subsession # in der aufgerufenen Funktion auf der Subsession-Ebene wird dann durch alle Gruppen gegangen # und da dann jeweils durch jeden Spieler um die Category zu kommunizieren. # This works now, but is not in compliance with the oTree manual.. I guess we found a bug. # returns an error message if a participant... # ... indicates field of studies and ticks the box "non-student". # ... states no field of studies and and does not tick the box. #elif "studies" not in values: