import os
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
from django.db.models.signals import post_save
from django.dispatch import receiver

# 2. مدل پروژه‌ها
class Project(models.Model):
    title = models.CharField(max_length=100, verbose_name="عنوان پروژه")
    description = models.TextField(blank=True, null=True, verbose_name="توضیحات")
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "پروژه"
        verbose_name_plural = "پروژه‌ها"


# 3. مدل پروفایل کاربر
class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile', verbose_name="کاربر")
    phone = models.CharField(max_length=15, verbose_name="شماره تماس", blank=True, null=True)
    avatar = models.ImageField(upload_to='avatars/', blank=True, null=True, verbose_name="آواتار")
    national_code = models.CharField(max_length=10, blank=True, null=True, verbose_name="کد ملی")
    birth_date = models.DateField(blank=True, null=True, verbose_name="تاریخ تولد")
    card_number = models.CharField(max_length=16, blank=True, null=True, verbose_name="شماره کارت")
    sheba_number = models.CharField(max_length=26, blank=True, null=True, verbose_name="شماره شبا")
    daily_status = models.CharField(max_length=100, blank=True, null=True, verbose_name="وضعیت روزانه")

    def save(self, *args, **kwargs):
        try:
            this = UserProfile.objects.get(id=self.id)
            if this.avatar and this.avatar != self.avatar:
                this.avatar.delete(save=False)
        except:
            pass
        super(UserProfile, self).save(*args, **kwargs)

    def __str__(self):
        return f"{self.user.username} - {self.user.get_full_name()}"

    class Meta:
        verbose_name = "پروفایل کاربر"
        verbose_name_plural = "پروفایل‌های کاربران"


# 4. مدل انواع فعالیت (TaskType)
class TaskType(models.Model):
    title = models.CharField(max_length=100, verbose_name="عنوان فعالیت")
    standard_duration = models.PositiveIntegerField(default=0, verbose_name="زمان استاندارد (دقیقه)")
    is_active = models.BooleanField(default=True, verbose_name="فعال")

    def __str__(self):
        return f"{self.title} ({self.standard_duration} دقیقه)"

    class Meta:
        verbose_name = "نوع فعالیت (استاندارد)"
        verbose_name_plural = "انواع فعالیت‌ها"


# 5. ثبت کار (Work Log)
class WorkLog(models.Model):
    STATUS_CHOICES = (
        ('pending', 'در حال انتظار'),
        ('doing', 'در حال انجام'),
        ('done', 'انجام شده'),
        ('suspended', 'تعویق'),
    )

    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="کاربر")
    project = models.ForeignKey(Project, on_delete=models.SET_NULL, null=True, verbose_name="پروژه")

    # ارتباط با نوع فعالیت
    task_type = models.ForeignKey(TaskType, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="نوع فعالیت")

    title = models.CharField(max_length=200, verbose_name="عنوان کار")
    description = models.TextField(blank=True, null=True, verbose_name="توضیحات تکمیلی")

    # زمان برآوردی
    estimated_minutes = models.PositiveIntegerField(default=0, verbose_name="زمان برآوردی (دقیقه)")

    start_time = models.DateTimeField(default=timezone.now, verbose_name="زمان شروع")
    end_time = models.DateTimeField(blank=True, null=True, verbose_name="زمان پایان")

    # --- تغییرات مهم اینجاست ---
    pause_duration = models.IntegerField(default=0, verbose_name="مدت توقف (ثانیه)")

    # فیلد جدید برای ذخیره زمان نهایی (دقیقه)
    final_time = models.PositiveIntegerField(
        default=0,
        verbose_name="زمان نهایی (دقیقه)",
        help_text="این زمان مبنای محاسبه امتیاز است. (پایان - شروع - توقف)"
    )

    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="وضعیت")
    created_date = models.DateField(auto_now_add=True, verbose_name="تاریخ ثبت")

    def save(self, *args, **kwargs):
        calculated_minutes = 0
        if self.start_time and self.end_time:
            total_seconds = (self.end_time - self.start_time).total_seconds()
            pause = self.pause_duration or 0
            net_seconds = max(0, total_seconds - pause)
            calculated_minutes = int(net_seconds // 60)

        # ✅ اگر دستی ست شده، همیشه همان معیار اصلی است
        if self.manual_final_time is not None:
            self.final_time = self.manual_final_time

        # ✅ اگر دستی نیست، فقط در done محاسبه سیستم انجام شود
        elif self.status == 'done' and self.start_time and self.end_time:
            self.final_time = calculated_minutes

        super().save(*args, **kwargs)

    # --- پراپرتی‌ها اصلاح شدند تا از final_time بخوانند ---

    @property
    def actual_minutes_display(self):
        # همیشه مقدار فیلد نهایی (چه سیستمی چه دستی) را برمی‌گرداند
        return self.final_time

    @property
    def actual_minutes(self):
        # جهت سازگاری با کدهای قدیمی‌تر اگر جایی استفاده شده
        return self.final_time

    @property
    def efficiency(self):
        if self.status == 'done':
            return self.estimated_minutes - self.final_time
        return 0

    @property
    def efficiency_percentage(self):
        """
        محاسبه درصد بازدهی بر اساس زمان نهایی
        """
        if self.status != 'done':
            return 0

        est = self.estimated_minutes or 0
        act = self.final_time

        if est == 0:
            return 0

        # (زمان تخمینی - زمان واقعی) / زمان تخمینی * 100
        return int(((est - act) / est) * 100)

    @property
    def duration(self):
        minutes = self.final_time
        h = minutes // 60
        m = minutes % 60
        return f"{h}:{m}"

    def __str__(self):
        return f"{self.title} ({self.user.username})"

    class Meta:
        verbose_name = "گزارش کار"
        verbose_name_plural = "گزارش‌های کار"

    manual_final_time = models.PositiveIntegerField(
        null=True, blank=True,
        verbose_name="زمان دستی (دقیقه)",
        help_text="اگر پر باشد، معیار اصلی می‌شود و سیستم overwrite نمی‌کند."
    )


# 6. مدل انواع درخواست
class RequestType(models.Model):
    title = models.CharField(max_length=100, verbose_name="عنوان درخواست")

    has_date_range = models.BooleanField(default=True, verbose_name="نیاز به تاریخ (از/تا) دارد؟")
    has_time_range = models.BooleanField(default=False, verbose_name="نیاز به ساعت (شروع/پایان) دارد؟")
    has_amount = models.BooleanField(default=False, verbose_name="نیاز به مبلغ دارد؟")
    has_description = models.BooleanField(default=True, verbose_name="نیاز به توضیحات دارد؟")

    is_active = models.BooleanField(default=True, verbose_name="فعال")

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = "نوع درخواست"
        verbose_name_plural = "انواع درخواست‌ها"


# 7. درخواست‌ها
class Request(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="کاربر")
    request_type = models.ForeignKey(RequestType, on_delete=models.PROTECT, verbose_name="نوع درخواست")

    from_date = models.DateTimeField(blank=True, null=True, verbose_name="از زمان")
    to_date = models.DateTimeField(blank=True, null=True, verbose_name="تا زمان")
    amount = models.DecimalField(max_digits=12, decimal_places=0, blank=True, null=True, verbose_name="مبلغ (تومان)")
    description = models.TextField(blank=True, null=True, verbose_name="توضیحات")

    STATUS_CHOICES = (
        ('pending', 'در انتظار'),
        ('approved', 'تایید شده'),
        ('rejected', 'رد شده'),
    )
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name='وضعیت')
    is_approved = models.BooleanField(default=False, verbose_name="تایید شده (قدیمی)")

    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.request_type.title} - {self.user.username}"

    class Meta:
        verbose_name = "درخواست"
        verbose_name_plural = "درخواست‌ها"


# 8. سوابق روزانه (مدل تجمیعی)
class Attendance(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="کاربر")
    date = models.DateField(default=timezone.localdate, verbose_name="تاریخ")

    first_clock_in = models.DateTimeField(verbose_name="اولین ورود", null=True, blank=True)
    last_clock_out = models.DateTimeField(blank=True, null=True, verbose_name="آخرین خروج")

    current_session_start = models.DateTimeField(blank=True, null=True, verbose_name="شروع نوبت جاری")

    total_seconds = models.IntegerField(default=0, verbose_name="مجموع کارکرد (ثانیه)")

    @property
    def is_active(self):
        return self.current_session_start is not None

    @property
    def duration_display(self):
        hours = self.total_seconds // 3600
        minutes = (self.total_seconds % 3600) // 60
        return f"{hours:02}:{minutes:02}"

    class Meta:
        verbose_name = "سوابق روزانه"
        verbose_name_plural = "سوابق روزانه"
        unique_together = ('user', 'date')


# 9. مدل ساخت خودکار پروفایل
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        UserProfile.objects.get_or_create(user=instance)

@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
    try:
        instance.profile.save()
    except:
        UserProfile.objects.get_or_create(user=instance)