from rest_framework import serializers
from admin_panel.serializers import *
from .models import *
from admin_panel.models import ContentManagement,Faq,CompatibilityHoroscope
from fortune_teller.models import *
from django.utils.timesince import timesince



class SeerSignSerializer(serializers.ModelSerializer):
	horoscope = HoroscopeSerializer()
	chinese_zodiac = ChineseZodiacSerializer()
	five_element = FiveElementsSerializer()
	mbti = MBTISerializer()
	class Meta:
		model = SeerUserSignDetail
		fields = ['horoscope', 'chinese_zodiac', 'five_element', 'mbti']


class SeerUserSerializer(serializers.ModelSerializer):
	seer_signs = SeerSignSerializer(source='seer_signs.first')
	languages = serializers.SerializerMethodField()
	hobbies = serializers.SerializerMethodField()
	images = serializers.SerializerMethodField()
	class Meta:
		model = SeerUser
		fields = ['id', 'first_name', 'last_name', 'email', 'gender', 'date_of_birth', 'phone_number',
				  'fcm_token', 'device_type', 'religion', 'profession', 'height','notification_status',
				  'country_origin', 'state', 'city', 'languages', 'hobbies', 'bio', 'education', 'income',
				  'images','timezone','is_profile_completed','referal_code','seer_signs',]

	def get_languages(self, obj):
		languages_string = obj.languages
		if languages_string:
			languages_array = languages_string.strip("[]").replace("'", "").split(", ")
		else:
			languages_array = []
		return languages_array
	
	def get_hobbies(self, obj):
		hobbies_string = obj.hobbies
		if hobbies_string:
			hobbies_array = hobbies_string.strip("[]").replace("'", "").split(", ")
		else:
			hobbies_array = []
		return hobbies_array
	
	def get_images(self, obj):
		images_string = obj.images
		if images_string:
			images_array = images_string.strip("[]").replace("'", "").split(", ")
		else:
			images_array = []
		return images_array
	

class UserNotificationSerializer(serializers.ModelSerializer):
	created_at_ago = serializers.SerializerMethodField()
	def get_created_at_ago(self, obj):
		return timesince(obj.created_at) + " ago"

	class Meta:
		model = SeerUserNotifications
		fields = ['id', 'message', 'notification_type', 'is_read', 'updated_at', 'created_at_ago']
	
	# class Meta:
	# 	model = SeerUserNotifications
	# 	fields = '__all__'

class ServiceSerializer(serializers.ModelSerializer):
	class Meta:
		model = Service
		fields = ['id', 'service_name' ]

class LanguageSerializer(serializers.ModelSerializer):
	class Meta:
		model = SeerUser
		fields = ['languages' ]


class SeerUserWalletSerializer(serializers.ModelSerializer):
	class Meta:
		model = SeerUserWallet
		fields = '__all__' 
	

class AppointmentFortuneTeller(serializers.ModelSerializer):
	first_name = serializers.CharField(source='fortune_teller.first_name', read_only=True)
	last_name = serializers.CharField(source='fortune_teller.last_name', read_only=True)
	image = serializers.CharField(source='fortune_teller.image', read_only=True)
	fortune_teller_services =  serializers.CharField(source = 'fortune_teller.services',read_only=True)

	class Meta:
		model = FortuneAppointmentBook
		fields = ['id','appointment_id', 'first_name', 'last_name','fortune_teller_services','appointment_date', 'image','appointment_time', 'service', 'service_type', 'price','appointment_status','twilio_channel_sid','twilio_room_name']

class SeerUserCardSerializer(serializers.ModelSerializer):
	class Meta:
		model = SeerUserCards
		fields = '__all__' 


class WalletTranscationSerializer(serializers.ModelSerializer):
	first_name = serializers.CharField(source='booking.fortune_teller.first_name', read_only=True)
	last_name = serializers.CharField(source='booking.fortune_teller.last_name', read_only=True)


	class Meta:
		model = SeerUserTranscation
		fields = ['id', 'transcation_id','amount','first_name','created_at','first_name','last_name','transcation_type'] 



class FortunerTellerReviewSerializer(serializers.ModelSerializer):
	seer_user_image =  serializers.CharField(source='seer_user.primary_image', read_only=True)
	seer_user_first_name =  serializers.CharField(source='seer_user.first_name', read_only=True)
	seer_user_last_name =  serializers.CharField(source='seer_user.last_name', read_only=True)
	class Meta:
		model = FortunetellerRatingReviews
		fields = ['id', 'seer_user','seer_user_first_name','seer_user_last_name','fortune_teller','rating','review','created_at','seer_user_image'] 



class SeerUserCompatibilitySerializer(serializers.ModelSerializer):
	seer_signs = SeerSignSerializer(source='seer_signs.first')
	languages = serializers.SerializerMethodField()
	hobbies = serializers.SerializerMethodField()
	images = serializers.SerializerMethodField()
	compatibility = serializers.SerializerMethodField(source='get_compatibility')
	login_user_signs = serializers.SerializerMethodField(source='get_login_user_signs')
	friend_status = serializers.SerializerMethodField(source='get_friend_status')
	class Meta:
		model = SeerUser
		fields = ['id', 'first_name', 'last_name', 'email', 'gender', 'date_of_birth', 'phone_number',
				  'fcm_token', 'device_type', 'religion', 'profession', 'height',
				  'country_origin', 'state', 'city', 'languages', 'hobbies', 'bio', 'education', 'income',
				  'images', 'is_profile_completed', 'seer_signs','compatibility','login_user_signs','friend_status']

	def get_languages(self, obj):
		languages_string = obj.languages
		if languages_string:
			languages_array = languages_string.strip("[]").replace("'", "").split(", ")
		else:
			languages_array = []
		return languages_array
	
	def get_hobbies(self, obj):
		hobbies_string = obj.hobbies
		if hobbies_string:
			hobbies_array = hobbies_string.strip("[]").replace("'", "").split(", ")
		else:
			hobbies_array = []
		return hobbies_array
	
	def get_images(self, obj):
		images_string = obj.images
		if images_string:
			images_array = images_string.strip("[]").replace("'", "").split(", ")
		else:
			images_array = []
		return images_array
	
	# def __init__(self, *args, **kwargs):
	# 	seer_user_id = kwargs.pop('seer_user_id', None)
	# 	super().__init__(*args, **kwargs)
	# 	self.seer_user_id = seer_user_id

	def get_compatibility(self,obj):
		login_user_id = self.context.get('seer_user_id')
		login_user = SeerUserSignDetail.objects.filter(seer_user=login_user_id).first()
		matched_user_signs = SeerUserSignDetail.objects.filter(seer_user=obj).first()
		login_user_horoscope = login_user.horoscope.horoscope
		login_user_chinese_zodiac = login_user.chinese_zodiac.chinese_zodiac
		login_user_element_name = login_user.five_element.element_name
		if login_user.mbti:
			login_user_mbti_name = login_user.mbti.mbti_name
		else:
			login_user_mbti_name = None
		login_user_gender =  login_user.seer_user.gender
		if matched_user_signs.mbti:
			matched_user_mbti = matched_user_signs.mbti.mbti_name
		else:
			matched_user_mbti = None
		compatibility_scores = []
		compatibility_data = {}
		if login_user_mbti_name and matched_user_mbti:
			mbti_weight = 0.5
			horoscope_weight = 0.3
			chinese_zodiac_weight = 0.1
			element_weight = 0.1
		else:
			mbti_weight = 0
			horoscope_weight = 0.6
			chinese_zodiac_weight = 0.2
			element_weight = 0.2
		# Get compatibility table
		if login_user_gender == 'Male':
			horoscope_compatibility = CompatibilityHoroscope.objects.filter(male_horoscope=login_user_horoscope,
						female_horoscope=matched_user_signs.horoscope.horoscope).first()
			
			chinese_zodiac_compatibility = CompatibilityChineseZodiac.objects.filter(male_chinese_zodiac=login_user_chinese_zodiac,
						female_chinese_zodiac=matched_user_signs.chinese_zodiac.chinese_zodiac).first()
			
			five_elements_compatibility = CompatibilityFiveElements.objects.filter(male_element_name=login_user_element_name,
						female_element_name=matched_user_signs.five_element.element_name).first()
			
			mbti_compatibility = CompatibilityMBTI.objects.filter(male_mbti_name=login_user_mbti_name,
						female_mbti_name=matched_user_mbti).first()
		else:
			horoscope_compatibility = CompatibilityHoroscope.objects.filter(male_horoscope=matched_user_signs.horoscope.horoscope,
						female_horoscope=login_user_horoscope).first()
			
			chinese_zodiac_compatibility = CompatibilityChineseZodiac.objects.filter(male_chinese_zodiac=matched_user_signs.chinese_zodiac.chinese_zodiac,
						female_chinese_zodiac=login_user_chinese_zodiac).first()
			
			five_elements_compatibility = CompatibilityFiveElements.objects.filter(male_element_name=matched_user_signs.five_element.element_name,
						female_element_name=login_user_element_name).first()
			
			mbti_compatibility = CompatibilityMBTI.objects.filter(male_mbti_name=matched_user_mbti,
						female_mbti_name=login_user_mbti_name).first()
			
		# Calculate compatibility scores based on weights and user values
		horoscope_score = horoscope_weight * horoscope_compatibility.compatibility_score
		zodiac_score = chinese_zodiac_weight * chinese_zodiac_compatibility.compatibility_score
		element_score = element_weight * five_elements_compatibility.compatibility_score
		mbti_score = mbti_weight * (mbti_compatibility.compatibility_score if mbti_compatibility and mbti_compatibility.compatibility_score is not None else 0)

		# Calculate the final weighted compatibility score
		total_weighted_score = mbti_score + horoscope_score + zodiac_score + element_score
		compatibility_data= {
					'horoscope_tagline': horoscope_compatibility.tagline,
					'horoscope_compatibility_score': horoscope_compatibility.compatibility_score,
					'horoscope_description': horoscope_compatibility.description,

					'chinese_zodiac_tagline':chinese_zodiac_compatibility.tagline,
					'chinese_zodiac_compatibility_score': chinese_zodiac_compatibility.compatibility_score,
					'chinese_zodiac_description':chinese_zodiac_compatibility.description,

					'five_elements_tagline':five_elements_compatibility.tagline,
					'five_elements_compatibility_score': five_elements_compatibility.compatibility_score,
					'five_elements_description':five_elements_compatibility.description,

					'mbti_tagline': None if not mbti_compatibility else mbti_compatibility.tagline,
					'mbti_compatibility_score': None if not mbti_compatibility else mbti_compatibility.compatibility_score,
					'mbti_description': None if not mbti_compatibility else mbti_compatibility.description,

					'total_weighted_score': total_weighted_score,
					
				}
		return compatibility_data
	
	def get_login_user_signs(self,obj):
		login_user_id = self.context.get('seer_user_id')
		login_user = SeerUserSignDetail.objects.filter(seer_user=login_user_id).first()
		horoscope = login_user.horoscope.horoscope
		chinese_zodiac = login_user.chinese_zodiac.chinese_zodiac
		element_name = login_user.five_element.element_name
		horoscope_image = login_user.horoscope.image
		chinese_zodiac_image = login_user.chinese_zodiac.image
		element_image = login_user.five_element.image
		if login_user.mbti:
			mbti_name = login_user.mbti.mbti_name
			mbti_image = login_user.mbti.image
		else:
			mbti_name = None
			mbti_image = None

		login_user_data = {
			'horoscope':horoscope,
			'horoscope_image':horoscope_image,
			'chinese_zodiac':chinese_zodiac,
			'chinese_zodiac_image':chinese_zodiac_image,
			'element_name':element_name,
			'element_image':element_image,
			'mbti_name':mbti_name,
			'mbti_image':mbti_image,
		}

		return login_user_data
	
	def get_friend_status(self,obj):
		login_user_id = self.context.get('seer_user_id')
		print('login_user=========',login_user_id)
		login_user = SeerUser.objects.filter(id=login_user_id).first()
		# friend_status = FriendRequest.objects.filter(
        # (models.Q(from_user=login_user, to_user=obj) | models.Q(from_user=obj, to_user=login_user)),
        # accepted=True
    	# ).exists()
		friend_status = FriendRequest.objects.filter(
        (models.Q(from_user=login_user, to_user=obj) | models.Q(from_user=obj, to_user=login_user))
    	)
		if not friend_status:
			friend_status = None
		else:
			for friends in friend_status:
				if friends.accepted==True:
					friend_status = 'friends'
				elif friends.accepted == False:
					friend_status = 'requested'
		return friend_status




class SeerUserFriendSerializer(serializers.ModelSerializer):
	friend_status = serializers.SerializerMethodField(source='get_friend_status')
	class Meta:
		model = SeerUser
		fields = ['id', 'first_name', 'last_name', 'date_of_birth', 'primary_image', 'profession', 'state', 'city',
				  'country_origin','friend_status']
	
	def get_friend_status(self,obj):
		login_user = self.context.get('login_user')
		print('login_user=========',login_user)
		# friend_status = FriendRequest.objects.filter(
        # (models.Q(from_user=login_user, to_user=obj) | models.Q(from_user=obj, to_user=login_user)),
        # accepted=True
    	# ).exists()
		friend_status = FriendRequest.objects.filter(
        (models.Q(from_user=login_user, to_user=obj) | models.Q(from_user=obj, to_user=login_user))
    	)
		if not friend_status:
			friend_status = None
		else:
			for friends in friend_status:
				if friends.accepted==True:
					friend_status = 'friends'
				elif friends.accepted == False:
					friend_status = 'requested'
		return friend_status


class SentFriendListSerializer(serializers.ModelSerializer):
	to_user = SeerUserFriendSerializer()

	class Meta:
		model = FriendRequest
		fields = ['id', 'to_user', 'accepted']


class ReceivedFriendListSerializer(serializers.ModelSerializer):
	from_user = SeerUserFriendSerializer()

	class Meta:
		model = FriendRequest
		fields = ['id', 'from_user', 'accepted']
	
"""

class CheckIsFriendSerializer(serializers.ModelSerializer):
	friend_status = serializers.SerializerMethodField(source='get_friend_status')
	class Meta:
		model = FriendRequest
		fields = ['friend_status']
	
	def get_friend_status(self,obj):
		friends = FriendRequest.objects.filter(
				(models.Q(from_user=obj) | models.Q(to_user=obj)) & models.Q(accepted=True)
			).select_related('from_user', 'to_user')
		
		if friends:
			friend_status = True
		else:
			friend_status = False
		
		return friend_status



class SentFriendListSerializer(serializers.ModelSerializer):
	# seer_user = SeerUserSerializer(source='to_user')
	user_id = serializers.CharField(source='to_user.id', read_only=True)
	first_name = serializers.CharField(source='to_user.first_name', read_only=True)
	last_name = serializers.CharField(source='to_user.last_name', read_only=True)
	date_of_birth = serializers.CharField(source='to_user.date_of_birth', read_only=True)
	image = serializers.CharField(source='to_user.primary_image', read_only=True)
	profession =  serializers.CharField(source = 'to_user.profession',read_only=True)
	state = serializers.CharField(source = 'to_user.state',read_only=True)
	city  = serializers.CharField(source = 'to_user.city',read_only=True)
	country_origin = serializers.CharField(source = 'to_user.country_origin',read_only=True)

	class Meta:
		model = FriendRequest
		fields = ['id','user_id','first_name','last_name','image','date_of_birth','profession','state','city','country_origin','accepted']


class ReceivedFriendListSerializer(serializers.ModelSerializer):
	# seer_user = SeerUserSerializer(source='to_user')
	user_id = serializers.CharField(source='from_user.id', read_only=True)
	first_name = serializers.CharField(source='from_user.first_name', read_only=True)
	last_name = serializers.CharField(source='from_user.last_name', read_only=True)
	date_of_birth = serializers.CharField(source='from_user.date_of_birth', read_only=True)
	image = serializers.CharField(source='from_user.primary_image', read_only=True)
	profession =  serializers.CharField(source = 'from_user.profession',read_only=True)
	state = serializers.CharField(source = 'from_user.state',read_only=True)
	city  = serializers.CharField(source = 'from_user.city',read_only=True)
	country_origin = serializers.CharField(source = 'from_user.country_origin',read_only=True)

	class Meta:
		model = FriendRequest
		fields = ['id','user_id','first_name','last_name','image','date_of_birth','profession','state','city','country_origin','accepted']

"""