import re

class ProposalContent:

	def __init__(
		self,
		openai_client, 
		product,
		model,
		set,
		props,
		brand_vision,
		brand_creation_reason,
		approach
	):
		self.openai_client = openai_client
		self.product = product
		self.model= model	
		self.set = set
		self.props = props
		self.brand_vision = brand_vision
		self.brand_creation_reason = brand_creation_reason
		self.approach = approach
		self.general_context = ""
		self.main_image_text = ""
		self.lifestyle_image_text = ""
		self.infographic_image_text = ""

	def generate_main_image_text(self):
		
		prompt = self.read_prompt_file("main_image")
		prompt = prompt.replace("{{context}}", self.general_context)
		self.main_image_text = self.openai_client.text_generation(prompt)

		return self.main_image_text

	def generate_main_image(self):

		content = self.extract_text_between_keywords(
			"#1:", "Main Image #2:", 
			self.main_image_text
		)
		prompt = self.read_prompt_file("general_context_image")
		prompt = prompt.replace("{{product}}", self.product)
		prompt = prompt.replace("{{image_description}}", content)

		return self.openai_client.image_generation(prompt)
	
	def generate_lifestyle_image_text(self):
		
		prompt = self.read_prompt_file("lifestyle_image")
		prompt = prompt.replace("{{context}}", self.general_context)
		prompt = prompt.replace("{{model}}", self.model)
		prompt = prompt.replace("{{set}}", self.set)
		prompt = prompt.replace("{{props}}", self.props)
		self.lifestyle_image_text = self.openai_client.text_generation(prompt) 

		return self.lifestyle_image_text

	def generate_lifestyle_image(self):

		content = self.extract_text_between_keywords(
			"#1:", "Lifestyle Image #2", 
			self.lifestyle_image_text
		)    
		prompt = self.read_prompt_file("general_context_image")
		prompt = prompt.replace("{{product}}", self.product)
		prompt = prompt.replace("{{image_description}}", content)

		return self.openai_client.image_generation(prompt)

	def generate_infographic_image_text(self):
		
		prompt = self.read_prompt_file("infographic_image")
		prompt = prompt.replace("{{context}}", self.general_context)
		prompt = prompt.replace("{{approach}}", self.approach)
		prompt = prompt.replace("{{model}}", self.model)
		prompt = prompt.replace("{{set}}", self.set)
		prompt = prompt.replace("{{props}}", self.props)
		self.infographic_image_text = self.openai_client.text_generation(prompt) 

		return self.infographic_image_text

	def generate_infographic_image(self):

		content = self.extract_text_between_keywords(
			"#1:", "Infographic #2:", 
			self.infographic_image_text
		)    
		prompt = self.read_prompt_file("general_context_image")
		prompt = prompt.replace("{{product}}", self.product)
		prompt = prompt.replace("{{image_description}}", content)

		return self.openai_client.image_generation(prompt)

	def generate_a_plus_content_text(self):

		prompt = self.read_prompt_file("a_plus_content")
		prompt = prompt.replace("{{context}}", self.general_context)
		prompt = prompt.replace("{{approach}}", self.approach)
		prompt = prompt.replace("{{model}}", self.model)
		prompt = prompt.replace("{{set}}", self.set)
		prompt = prompt.replace("{{props}}", self.props)

		return self.openai_client.text_generation(prompt)

	def generate_listing_video_text(self):
		
		prompt = self.read_prompt_file("listing_video")
		prompt = prompt.replace("{{context}}", self.general_context)
		prompt = prompt.replace("{{model}}", self.model)
		prompt = prompt.replace("{{set}}", self.set)
		prompt = prompt.replace("{{props}}", self.props)

		return self.openai_client.text_generation(prompt)

	def generate_premium_a_plus_content_text(self):

		prompt = self.read_prompt_file("premium_a_plus_content")
		prompt = prompt.replace("{{context}}", self.general_context)
		prompt = prompt.replace("{{model}}", self.model)
		prompt = prompt.replace("{{set}}", self.set)
		prompt = prompt.replace("{{props}}", self.props)

		return self.openai_client.text_generation(prompt) 

	def generate_premium_a_plus_video_content_text(self):

		prompt = self.read_prompt_file("premium_a_plus_content_video")
		prompt = prompt.replace("{{context}}", self.general_context)
		prompt = prompt.replace("{{model}}", self.model)
		prompt = prompt.replace("{{set}}", self.set)
		prompt = prompt.replace("{{props}}", self.props)

		return self.openai_client.text_generation(prompt)

	def generate_sponsored_ads_video_text(self):

		prompt = self.read_prompt_file("sponsored_ads_video")
		prompt = prompt.replace("{{context}}", self.general_context)
		prompt = prompt.replace("{{model}}", self.model)
		prompt = prompt.replace("{{set}}", self.set)
		prompt = prompt.replace("{{props}}", self.props)

		return self.openai_client.text_generation(prompt)

	def generate_brand_story_text(self):

		prompt = self.read_prompt_file("brand_story")
		prompt = prompt.replace("{{context}}", self.general_context)
		prompt = prompt.replace("{{model}}", self.model)
		prompt = prompt.replace("{{set}}", self.set)
		prompt = prompt.replace("{{props}}", self.props)
		prompt = prompt.replace("{{brand_vision}}", self.brand_vision)
		prompt = prompt.replace("{{brand_creation_reason}}", self.brand_creation_reason)

		return self.openai_client.text_generation(prompt)	

	def build_general_context(
		self,
		product_title,
		product_description, 
		buyer_persona, 
		differentiating_factors,
		highlights_features
	):
		text = self.read_prompt_file("general_context")
		text = text.replace("{{product_title}}", product_title)
		text = text.replace("{{product_description}}", product_description)
		text = text.replace("{{buyer_persona}}", buyer_persona)
		text = text.replace("{{differentiating_factors}}", differentiating_factors)
		text = text.replace("{{highlights_features}}", highlights_features)

		self.general_context = text

	def extract_text_between_keywords(self, start_word, end_word, text):

		patron = re.compile(f'{re.escape(start_word)}(.*?){re.escape(end_word)}', re.DOTALL)
		resultado = patron.search(text)

		return resultado.group(1).strip()

	def read_prompt_file(self, file_name):

		with open(f"src/resources/prompts/{file_name}.txt", "r") as file:
			return file.read()