from django.db import models


class AppUser(models.Model):
	ROLE_CHOICES = [
		('user', 'User'),
		('doctor', 'Doctor'),
		('admin', 'Admin'),
	]
	STATUS_CHOICES = [
		('active', 'Active'),
		('inactive', 'Inactive'),
		('banned', 'Banned'),
	]

	id = models.AutoField(primary_key=True)
	name = models.CharField(max_length=255)
	email = models.EmailField(max_length=255)
	password = models.CharField(max_length=255)
	phone = models.CharField(max_length=20, blank=True, null=True)
	address = models.TextField(blank=True, null=True)
	date_of_birth = models.DateField(blank=True, null=True)
	age = models.IntegerField(blank=True, null=True)
	role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='user')
	profile_image = models.CharField(max_length=255, blank=True, null=True)
	bio = models.TextField(blank=True, null=True)
	cycle_length_days = models.IntegerField(default=28)
	last_period_date = models.DateField(blank=True, null=True)
	is_pregnant = models.BooleanField(default=False)
	health_conditions = models.JSONField(blank=True, null=True)
	status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active')
	created_at = models.DateTimeField(blank=True, null=True)
	updated_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'users'
		ordering = ['-id']

	def __str__(self):
		return f'{self.name} ({self.role})'


class UserOnboarding(models.Model):
	id = models.AutoField(primary_key=True)
	user = models.OneToOneField(
		AppUser,
		on_delete=models.CASCADE,
		db_column='user_id',
		related_name='onboarding',
	)
	is_married = models.BooleanField()
	first_period_age = models.IntegerField()
	last_period_first_day = models.DateField()
	is_planning_baby = models.BooleanField(blank=True, null=True)
	created_at = models.DateTimeField(blank=True, null=True)
	updated_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'user_onboarding'

	def __str__(self):
		return f'Onboarding - {self.user_id}'


class PeriodLog(models.Model):
	FLOW_CHOICES = [
		('light', 'Light'),
		('medium', 'Medium'),
		('heavy', 'Heavy'),
	]

	id = models.AutoField(primary_key=True)
	user = models.ForeignKey(AppUser, on_delete=models.CASCADE, db_column='user_id')
	start_date = models.DateField()
	end_date = models.DateField(blank=True, null=True)
	symptoms = models.JSONField(blank=True, null=True)
	mood = models.CharField(max_length=50, blank=True, null=True)
	flow_intensity = models.CharField(max_length=20, choices=FLOW_CHOICES, blank=True, null=True)
	notes = models.TextField(blank=True, null=True)
	created_at = models.DateTimeField(blank=True, null=True)
	updated_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'period_logs'
		ordering = ['-start_date']

	def __str__(self):
		return f'PeriodLog #{self.id} - User {self.user_id}'


class PregnancyTracking(models.Model):
	STATUS_CHOICES = [
		('active', 'Active'),
		('completed', 'Completed'),
		('miscarriage', 'Miscarriage'),
	]

	id = models.AutoField(primary_key=True)
	user = models.OneToOneField(AppUser, on_delete=models.CASCADE, db_column='user_id')
	start_date = models.DateField()
	due_date = models.DateField(blank=True, null=True)
	current_week = models.IntegerField(blank=True, null=True)
	notes = models.TextField(blank=True, null=True)
	last_checkup_date = models.DateField(blank=True, null=True)
	status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active')
	created_at = models.DateTimeField(blank=True, null=True)
	updated_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'pregnancy_tracking'

	def __str__(self):
		return f'Pregnancy - User {self.user_id}'


class Consultation(models.Model):
	STATUS_CHOICES = [
		('pending', 'Pending'),
		('confirmed', 'Confirmed'),
		('completed', 'Completed'),
		('cancelled', 'Cancelled'),
	]

	id = models.AutoField(primary_key=True)
	user = models.ForeignKey(AppUser, on_delete=models.CASCADE, db_column='user_id', related_name='consultations_as_user')
	doctor = models.ForeignKey(AppUser, on_delete=models.CASCADE, db_column='doctor_id', related_name='consultations_as_doctor')
	topic = models.CharField(max_length=255, blank=True, null=True)
	chat_history = models.JSONField(blank=True, null=True)
	appointment_time = models.DateTimeField(blank=True, null=True)
	status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
	prescription_url = models.CharField(max_length=255, blank=True, null=True)
	notes = models.TextField(blank=True, null=True)
	rating = models.IntegerField(blank=True, null=True)
	created_at = models.DateTimeField(blank=True, null=True)
	updated_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'consultations'
		ordering = ['-updated_at']

	def __str__(self):
		return f'Consultation #{self.id}'


class FeedPost(models.Model):
	id = models.BigAutoField(primary_key=True)
	user = models.ForeignKey(AppUser, on_delete=models.CASCADE, db_column='user_id')
	content = models.TextField(blank=True, null=True)
	media = models.JSONField(blank=True, null=True)
	created_at = models.DateTimeField(blank=True, null=True)
	updated_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'feed_posts'
		ordering = ['-created_at']

	def __str__(self):
		return f'FeedPost #{self.id}'


class FeedPostLike(models.Model):
	id = models.BigAutoField(primary_key=True)
	post = models.ForeignKey(FeedPost, on_delete=models.CASCADE, db_column='post_id')
	user = models.ForeignKey(AppUser, on_delete=models.CASCADE, db_column='user_id')
	created_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'feed_post_likes'


class FeedPostComment(models.Model):
	id = models.BigAutoField(primary_key=True)
	post = models.ForeignKey(FeedPost, on_delete=models.CASCADE, db_column='post_id')
	user = models.ForeignKey(AppUser, on_delete=models.CASCADE, db_column='user_id')
	text = models.TextField()
	created_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'feed_post_comments'
		ordering = ['created_at']


class Notification(models.Model):
	TYPE_CHOICES = [
		('period_reminder', 'Period Reminder'),
		('appointment', 'Appointment'),
		('health_tip', 'Health Tip'),
		('alert', 'Alert'),
	]

	id = models.BigAutoField(primary_key=True)
	user = models.ForeignKey(AppUser, on_delete=models.CASCADE, db_column='user_id')
	title = models.CharField(max_length=255)
	message = models.TextField()
	type = models.CharField(max_length=20, choices=TYPE_CHOICES, default='alert')
	is_read = models.BooleanField(default=False)
	action_url = models.CharField(max_length=255, blank=True, null=True)
	created_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'notifications'
		ordering = ['-created_at']

	def __str__(self):
		return f'Notification #{self.id} - {self.title}'


class UserSetting(models.Model):
	id = models.BigAutoField(primary_key=True)
	user = models.OneToOneField(AppUser, on_delete=models.CASCADE, db_column='user_id')
	language = models.CharField(max_length=20, default='English')
	notifications_enabled = models.BooleanField(default=True)
	created_at = models.DateTimeField(blank=True, null=True)
	updated_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'user_settings'


class KnowledgeTopic(models.Model):
	STATUS_CHOICES = [
		('active', 'Active'),
		('inactive', 'Inactive'),
	]

	id = models.AutoField(primary_key=True)
	title = models.CharField(max_length=255)
	description = models.TextField(blank=True, null=True)
	status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active')
	created_by = models.ForeignKey(AppUser, on_delete=models.SET_NULL, db_column='created_by', blank=True, null=True)
	created_at = models.DateTimeField(blank=True, null=True)
	updated_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'knowledge_topics'
		ordering = ['-created_at']

	def __str__(self):
		return self.title


class KnowledgeContent(models.Model):
	STATUS_CHOICES = [
		('active', 'Active'),
		('inactive', 'Inactive'),
	]

	id = models.AutoField(primary_key=True)
	topic = models.ForeignKey(KnowledgeTopic, on_delete=models.CASCADE, db_column='topic_id')
	title = models.CharField(max_length=255)
	content = models.TextField()
	status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='active')
	created_by = models.ForeignKey(AppUser, on_delete=models.SET_NULL, db_column='created_by', blank=True, null=True)
	created_at = models.DateTimeField(blank=True, null=True)
	updated_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'knowledge_contents'
		ordering = ['-created_at']

	def __str__(self):
		return self.title


class AdminAuditLog(models.Model):
	id = models.AutoField(primary_key=True)
	admin = models.ForeignKey(AppUser, on_delete=models.CASCADE, db_column='admin_id', related_name='audit_logs')
	action = models.CharField(max_length=255)
	target_user = models.ForeignKey(AppUser, on_delete=models.SET_NULL, db_column='target_user_id', blank=True, null=True, related_name='audit_targets')
	description = models.TextField(blank=True, null=True)
	old_value = models.JSONField(blank=True, null=True)
	new_value = models.JSONField(blank=True, null=True)
	created_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'admin_audit_log'
		ordering = ['-created_at']


class AdminReport(models.Model):
	REPORT_CHOICES = [
		('user_stats', 'User Stats'),
		('consultation_stats', 'Consultation Stats'),
		('system_health', 'System Health'),
	]

	id = models.AutoField(primary_key=True)
	report_type = models.CharField(max_length=30, choices=REPORT_CHOICES, default='user_stats')
	title = models.CharField(max_length=255, blank=True, null=True)
	data = models.JSONField(blank=True, null=True)
	generated_by = models.ForeignKey(AppUser, on_delete=models.SET_NULL, db_column='generated_by', blank=True, null=True)
	generated_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'admin_reports'
		ordering = ['-generated_at']


class UserFeedback(models.Model):
	STATUS_CHOICES = [
		('new', 'New'),
		('in_review', 'In Review'),
		('resolved', 'Resolved'),
	]

	id = models.AutoField(primary_key=True)
	user = models.ForeignKey(AppUser, on_delete=models.SET_NULL, db_column='user_id', blank=True, null=True)
	feedback_type = models.CharField(max_length=100, blank=True, null=True)
	message = models.TextField()
	rating = models.IntegerField(blank=True, null=True)
	status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='new')
	created_at = models.DateTimeField(blank=True, null=True)

	class Meta:
		managed = False
		db_table = 'user_feedback'
		ordering = ['-created_at']

class AdminWorkflow(models.Model):
    """Track admin workflows and approvals."""

    WORKFLOW_TYPE_CHOICES = [
        ('doctor_approval', 'Doctor Approval'),
        ('content_moderation', 'Content Moderation'),
        ('user_report', 'User Report'),
        ('feedback_review', 'Feedback Review'),
    ]

    STATUS_CHOICES = [
        ('pending', 'Pending'),
        ('approved', 'Approved'),
        ('rejected', 'Rejected'),
        ('in_review', 'In Review'),
    ]

    id = models.AutoField(primary_key=True)
    workflow_type = models.CharField(max_length=30, choices=WORKFLOW_TYPE_CHOICES)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
    target_user = models.ForeignKey(
        AppUser,
        on_delete=models.CASCADE,
        db_column='target_user_id',
        null=True,
        blank=True,
        related_name='workflows',
    )
    description = models.TextField(blank=True, null=True)
    reason = models.TextField(blank=True, null=True)
    data = models.JSONField(blank=True, null=True)
    assigned_to = models.ForeignKey(
        AppUser,
        on_delete=models.SET_NULL,
        db_column='assigned_to',
        null=True,
        blank=True,
        related_name='assigned_workflows',
    )
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    completed_at = models.DateTimeField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'admin_workflows'
        ordering = ['-created_at']

    def __str__(self):
        return f'{self.get_workflow_type_display()} - {self.get_status_display()}'


class DeviceToken(models.Model):
    """Push notification device tokens — managed by Django."""
    PLATFORM_CHOICES = [('android', 'Android'), ('ios', 'iOS'), ('web', 'Web')]

    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(
        AppUser, on_delete=models.CASCADE,
        db_column='user_id', related_name='device_tokens',
    )
    token = models.CharField(max_length=512, unique=True)
    platform = models.CharField(max_length=20, choices=PLATFORM_CHOICES, default='android')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        managed = True
        db_table = 'device_tokens'

    def __str__(self):
        return f'DeviceToken({self.platform}) - User {self.user_id}'


class PasswordResetCode(models.Model):
    """Temporary codes for forgot-password flow — managed by Django."""
    id = models.AutoField(primary_key=True)
    email = models.EmailField(max_length=255, db_index=True)
    code = models.CharField(max_length=6)
    expires_at = models.DateTimeField()
    used = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        managed = True
        db_table = 'password_reset_codes'