from rest_framework import serializers
from admin_panel.models import Service, ContentManagement, Skill
from admin_panel.serializers import *
from .models import *
from fortune_teller.models import FortunetellerRatingReviews
from datetime import datetime
from django.utils.timesince import timesince
import json

class ServiceSerializer(serializers.ModelSerializer):
	class Meta:
		model = Service
		fields = '__all__'


class SkillSerializer(serializers.ModelSerializer):
	class Meta:
		model = Skill
		fields = '__all__'
		
class FortuneSignSerializer(serializers.ModelSerializer):
	horoscope = HoroscopeSerializer()
	chinese_zodiac = ChineseZodiacSerializer()
	five_element = FiveElementsSerializer()
	mbti = MBTISerializer()
	class Meta:
		model = FortuneTellerSignDetail
		fields = ['horoscope', 'chinese_zodiac', 'five_element', 'mbti']
				

class FortuneTellerSerializer(serializers.ModelSerializer):
	fortune_signs = FortuneSignSerializer(source='fortune_signs.first')
	services = serializers.SerializerMethodField()
	skills = serializers.SerializerMethodField()
	languages = serializers.SerializerMethodField()
	chat_price = serializers.SerializerMethodField(source='get_chat_price')
	video_price = serializers.SerializerMethodField(source='get_video_price')
	is_favourite = serializers.SerializerMethodField(source='get_is_favourite')

	class Meta:
		model = FortuneTeller
		fields = ['id', 'first_name', 'last_name', 'email', 'gender', 'services', 'skills', 'date_of_birth', 'phone_number',
				  'fcm_token', 'device_type', 'total_experience', 'languages', 'bio','bank_details','timezone',
				  'image', 'notification_status', 'is_profile_completed','is_stripe_account_connect','is_stripe_verified','rating','referal_code','video_price','chat_price','is_favourite','is_online','fortune_signs']

	def get_services(self, obj):
		services_string = obj.services
		if services_string:
			return [service.strip() for service in services_string.split(',')]
		return []

	def get_skills(self, obj):
		skills_string = obj.skills
		if skills_string:
			return [skill.strip() for skill in skills_string.split(',')]
		return []

	def get_languages(self, obj):
		languages_string = obj.languages
		if languages_string:
			return [language.strip() for language in languages_string.split(',')]
		return []
	
	def get_video_price(self, obj):
		fortune_time_slots = FortuneTellerTiming.objects.filter(fortune_teller=obj).first()
		if fortune_time_slots:
			slots_data = fortune_time_slots.slots
			timedata = json.loads(slots_data)
			current_time = datetime.now()
			weekday = current_time.weekday()
			weekday_names = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
			weekday_name = weekday_names[weekday]
			for data in timedata:
				if data['day'] == weekday_name:
					if data['is_active']:
						price_data = data['video_price']
					else:
						price_data = 'N/A'
			return price_data
		else:
			return 'N/A'
	
	def get_chat_price(self, obj):
		fortune_time_slots = FortuneTellerTiming.objects.filter(fortune_teller=obj).first()
		if fortune_time_slots:
			slots_data = fortune_time_slots.slots
			timedata = json.loads(slots_data)
			current_time = datetime.now()
			weekday = current_time.weekday()
			weekday_names = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
			weekday_name = weekday_names[weekday]
			for data in timedata:
				if data['day'] == weekday_name:
					if data['is_active']:
						price_data = data['chat_price']	
					else:
						price_data = 'N/A'
			return price_data
		else:
			return "N/A"
	
	def get_is_favourite(self,obj):
		login_user = self.context.get('seer_user')
		fortune_favourite = FavouriteUnfavouriteFortune.objects.filter(fortune=obj,seer_user=login_user).first()
		if fortune_favourite:
			is_favourite = True
		else:
			is_favourite = False
		return is_favourite
			


class FortuneNotificationSerializer(serializers.ModelSerializer):
	created_at_ago = serializers.SerializerMethodField()

	def get_created_at_ago(self, obj):
		return timesince(obj.created_at) + " ago"

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



class FortuneTimingSerializer(serializers.ModelSerializer):
	slots = serializers.SerializerMethodField()
	class Meta:
		model = FortuneTellerTiming
		fields = ['slots','created_at','updated_at']

	def get_slots(self, obj):
		slots_data = obj.slots
		jsonData = json.loads(slots_data)
		return jsonData

import pytz
from datetime import datetime
class AppointmentRequestListSerializer(serializers.ModelSerializer):
	first_name = serializers.CharField(source='seer_user.first_name', read_only=True)
	last_name = serializers.CharField(source='seer_user.last_name', read_only=True)
	user_id = serializers.CharField(source='seer_user.id', read_only=True)
	profession = serializers.CharField(source='seer_user.profession', read_only=True)
	primary_image =  serializers.CharField(source='seer_user.primary_image', read_only=True)
	state =  serializers.CharField(source='seer_user.state', read_only=True)
	city =  serializers.CharField(source='seer_user.city', read_only=True)
	date_of_birth =  serializers.CharField(source='seer_user.date_of_birth', read_only=True)

	class Meta:
		model = FortuneAppointmentBook

		fields = ['id','appointment_id','price','appointment_date','appointment_time','created_at','user_id','first_name','last_name','profession','primary_image','state','city','date_of_birth','service_type','twilio_channel_sid','twilio_room_name','appointment_status']

	def to_representation(self, instance):
		data = super(AppointmentRequestListSerializer, self).to_representation(instance)

		# Get the user's timezone (Assuming it's available as instance.seer_user.timezone)
		user_timezone = pytz.timezone(instance.seer_user.timezone)
		# Get the fortune teller's timezone (Assuming it's available as instance.fortune_teller.timezone)
		fortune_timezone = pytz.timezone(instance.fortune_teller.timezone)

		# Extract the appointment date and time from the data
		appointment_date_str = data['appointment_date']
		appointment_time_range = data['appointment_time']
		# Split the time range into start and end times
		start_time_str, end_time_str = appointment_time_range.split('-')

		# Parse the start and end times
		start_time = datetime.strptime(start_time_str.strip(), '%I:%M %p')
		end_time = datetime.strptime(end_time_str.strip(), '%I:%M %p')

		# Convert the appointment date to a datetime object
		appointment_date = datetime.strptime(appointment_date_str, '%d %B %Y')

		# Combine the appointment date with the parsed start and end times
		start_datetime = appointment_date.replace(hour=start_time.hour, minute=start_time.minute)
		end_datetime = appointment_date.replace(hour=end_time.hour, minute=end_time.minute)

		# Create datetime objects for the start and end times using the user's timezone
		start_time_user_timezone = user_timezone.localize(start_datetime)
		end_time_user_timezone = user_timezone.localize(end_datetime)

		# Convert the start and end times to the fortune teller's timezone
		start_time_fortune = start_time_user_timezone.astimezone(fortune_timezone)
		end_time_fortune = end_time_user_timezone.astimezone(fortune_timezone)
		formatted_date = start_time_fortune.strftime('%d %B %Y')

		# Update the 'appointment_date' and 'appointment_time' fields in the serialized data
		data['appointment_date'] = formatted_date 
		data['appointment_time'] = start_time_fortune.strftime('%I:%M %p') + '-' + end_time_fortune.strftime('%I:%M %p')

		return data

class ForutuneTellerWalletSerializer(serializers.ModelSerializer):
	class Meta:
		model = FotuneTellerWallet
		fields = '__all__' 


class WalletTranscationSerializer(serializers.ModelSerializer):
	user_first_name = serializers.CharField(source='seer_user.first_name', read_only=True)
	user_last_name = serializers.CharField(source='seer_user.last_name', read_only=True)
	fortune_first_name = serializers.CharField(source='fortune_teller.first_name', read_only=True)
	fortune_last_name = serializers.CharField(source='fortune_teller.first_name', read_only=True)

	class Meta:
		model = FortuneTellerTranscations
		fields = ['id', 'transcation_id','amount','user_first_name','created_at','user_last_name','fortune_first_name','fortune_last_name','transcation_type'] 

class PayoutTranscationSerializer(serializers.ModelSerializer):
	fortune_first_name = serializers.CharField(source='fortune_teller.first_name', read_only=True)
	fortune_last_name = serializers.CharField(source='fortune_teller.first_name', read_only=True)

	class Meta:
		model = FortunePayoutTranscation
		fields = ['id', 'transcation_id','amount','created_at','fortune_first_name','fortune_last_name','transcation_status'] 
