from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
from .models import Project, UserProfile, WorkLog, Request, Attendance, RequestType, TaskType
import jdatetime
from django.utils.html import format_html
from django.utils.safestring import mark_safe 
from django.utils import timezone
from datetime import timedelta
import calendar 

# --- ایمپورت مدل‌های Scoring ---
try:
    from Scoring.models import WorkScore
except ImportError:
    WorkScore = None

# --- ثبت مدل‌های ساده ---
admin.site.register(Project)

# --- TaskType Admin ---
@admin.register(TaskType)
class TaskTypeAdmin(admin.ModelAdmin):
    list_display = ('title', 'standard_duration', 'get_complexity_display', 'is_active')
    list_editable = ('standard_duration', 'is_active')
    search_fields = ('title',)

    @admin.display(description="سختی")
    def get_complexity_display(self, obj):
        if hasattr(obj, 'scoring_value'):
            return obj.scoring_value.complexity_coefficient
        return "1.0"

# --- Attendance Admin ---
@admin.register(Attendance)
class AttendanceAdmin(admin.ModelAdmin):
    list_display = ('get_user_name', 'get_jalali_date', 'get_start', 'get_end', 'duration_display', 'get_status_text')
    list_filter = ('user', 'date')
    search_fields = ('user__username',)
    date_hierarchy = 'date'

    @admin.display(description='نام کاربر', ordering='user')
    def get_user_name(self, obj): return obj.user.get_full_name() or obj.user.username
    @admin.display(description='تاریخ', ordering='date')
    def get_jalali_date(self, obj):
        if obj.date:
            try:
                j_date = jdatetime.date.fromgregorian(date=obj.date)
                return j_date.strftime('%Y/%m/%d')
            except Exception as e:
                return f"{obj.date} (خطا)"
        return "-"
    @admin.display(description='مجموع')
    def duration_display(self, obj):
        h = obj.total_seconds // 3600
        m = (obj.total_seconds % 3600) // 60
        return f"{h:02}:{m:02}"
    def get_start(self, obj):
        if obj.first_clock_in:
            return timezone.localtime(obj.first_clock_in).strftime("%H:%M")
        return "-"

    def get_end(self, obj):
        if obj.last_clock_out:
            return timezone.localtime(obj.last_clock_out).strftime("%H:%M")
        return "-"

    def get_status_text(self, obj): return "✔ فعال" if obj.current_session_start else "✖ پایان"

# --- Request Admin ---
@admin.register(RequestType)
class RequestTypeAdmin(admin.ModelAdmin):
    list_display = ('title', 'is_active')

@admin.register(Request)
class RequestAdmin(admin.ModelAdmin):
    list_display = ('user', 'request_type', 'status')


# ==========================================
#  تنظیمات جدید و پیشرفته برای WorkLog
# ==========================================

class WorkScoreInline(admin.StackedInline):
    model = WorkScore
    can_delete = False
    verbose_name = "امتیاز و ارزیابی نهایی"
    verbose_name_plural = "ارزیابی و امتیازدهی"

    fields = (
        ('quality_rating', 'manual_complexity', 'manual_seniority', 'show_colored_score'),
        'manager_note'
    )

    # فیلد اصلی امتیاز را مخفی می‌کنیم و نسخه رنگی خودمان را نشان می‌دهیم
    readonly_fields = ('show_colored_score',)

    @admin.display(description="امتیاز نهایی")
    def show_colored_score(self, obj):
        score = obj.final_task_score
        color = "#2ecc71" if score > 0 else "#e74c3c"
        return format_html(
            '<div style="background-color: {}; color: white; padding: 5px 15px; border-radius: 5px; font-weight: bold; font-size: 1.2em; display: inline-block;">{}</div>',
            color, score
        )

    def formfield_for_dbfield(self, db_field, request, **kwargs):
        field = super().formfield_for_dbfield(db_field, request, **kwargs)
        if db_field.name == 'manager_note':
            field.widget.attrs['rows'] = 2
            field.widget.attrs['placeholder'] = 'یادداشت کوتاه مدیر...'
            field.widget.attrs['style'] = 'width: 100%;'
        return field

    def get_formset(self, request, obj=None, **kwargs):
        formset = super().get_formset(request, obj, **kwargs)
        form = formset.form

        default_comp = 1.0
        default_sen = 1.0

        if obj:
            if obj.task_type and hasattr(obj.task_type, 'scoring_value'):
                default_comp = obj.task_type.scoring_value.complexity_coefficient

            if hasattr(obj.user, 'profile') and hasattr(obj.user.profile, 'scoring_level'):
                default_sen = obj.user.profile.scoring_level.seniority_coefficient

        field_comp = form.base_fields.get('manual_complexity')
        if field_comp:
            field_comp.help_text = format_html(
                '<span style="color:#666; font-size:11px;">پیش‌فرض سیستم: <b>{}</b> (اگر خالی باشد، این اعمال می‌شود)</span>',
                default_comp
            )

        field_sen = form.base_fields.get('manual_seniority')
        if field_sen:
            field_sen.help_text = format_html(
                '<span style="color:#666; font-size:11px;">پیش‌فرض سیستم: <b>{}</b> (اگر خالی باشد، این اعمال می‌شود)</span>',
                default_sen
            )

        return formset

@admin.register(WorkLog)
class WorkLogAdmin(admin.ModelAdmin):
    list_display = (
        'get_project_title', 'get_user_firstname', 'get_task_duration',
        'show_final_time_editable',
        'get_factors_display', 'get_final_score_display',
        'get_status_colored', 'get_jalali_start_date'
    )

    list_filter = (('start_time', admin.DateFieldListFilter), 'user', 'status', 'project', 'task_type')
    search_fields = ('title', 'description', 'user__username')
    inlines = [WorkScoreInline] if WorkScore else []

    fieldsets = (
        ('اطلاعات پایه', {
            'fields': (
                ('user', 'project', 'task_type', 'status'),
            ),
            'classes': ('wide',),
        }),
        ('جزئیات انجام کار', {
            'fields': (
                ('title', 'estimated_minutes'),
                'description',
            ),
        }),
        ('مدیریت زمان', {
            'fields': (
                ('start_time', 'end_time'),
                'final_time', # فقط فیلد نهایی
            ),
            'description': '''
                <style>
                    .datetime { display: flex; gap: 10px; align-items: center; }
                    .datetime br { display: none; }
                    .field-final_time label { font-weight: bold; color: #2c3e50; }
                    .field-final_time input { border: 2px solid #3498db; width: 120px; text-align: center; font-weight: bold; font-size: 1.1em; border-radius: 4px; }
                </style>
            '''
        }),
    )

    @admin.display(description="زمان صرف شده")
    def show_final_time_editable(self, obj):
        return format_html('<b style="color: #2c3e50;">{} دقیقه</b>', obj.final_time)

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj, **kwargs)

        # تغییر لیبل فیلد به "زمان صرف شده" فقط در فرم ویرایش
        if 'final_time' in form.base_fields:
            form.base_fields['final_time'].label = "زمان صرف شده (دقیقه)"
            form.base_fields['final_time'].help_text = "" # حذف متن راهنما

        for field in ['user', 'project', 'task_type']:
            if field in form.base_fields:
                widget = form.base_fields[field].widget
                widget.can_add_related = False
                widget.can_change_related = False
                widget.can_delete_related = False

        if 'description' in form.base_fields:
            form.base_fields['description'].widget.attrs['rows'] = 1
            form.base_fields['description'].widget.attrs['style'] = 'width: 100%;'

        return form

    # --- سایر متدهای نمایشی ---
    @admin.display(description='پروژه / عنوان', ordering='project')
    def get_project_title(self, obj):
        p_name = obj.project.title if obj.project else "آزاد"
        return f"{p_name} / {obj.title}"

    @admin.display(description='نام', ordering='user__first_name')
    def get_user_firstname(self, obj):
        return obj.user.first_name or obj.user.username

    @admin.display(description='فعالیت (زمان)')
    def get_task_duration(self, obj):
        t_title = obj.task_type.title if obj.task_type else "-"
        return f"{t_title} ({obj.estimated_minutes} دقیقه)"

    @admin.display(description='سختی / تجربه')
    def get_factors_display(self, obj):
        score = getattr(obj, 'scoring_detail', None)
        complexity = 1.0
        seniority = 1.0

        if score and score.manual_complexity: complexity = score.manual_complexity
        elif obj.task_type and hasattr(obj.task_type, 'scoring_value') and obj.task_type.scoring_value:
                complexity = obj.task_type.scoring_value.complexity_coefficient

        if score and score.manual_seniority: seniority = score.manual_seniority
        elif hasattr(obj.user, 'profile') and hasattr(obj.user.profile, 'scoring_level') and obj.user.profile.scoring_level:
                seniority = obj.user.profile.scoring_level.seniority_coefficient

        return format_html(
            '<div style="font-weight:bold;">'
            '<span style="color:#e67e22;" title="سختی">{}</span> / '
            '<span style="color:#2980b9;" title="تجربه">{}</span>'
            '</div>', complexity, seniority
        )

    @admin.display(description="کیفیت")
    def get_score_stars(self, obj):
        score = getattr(obj, 'scoring_detail', None)
        if score and score.quality_rating:
            return "⭐" * int(score.quality_rating)
        return "-"

    @admin.display(description="امتیاز", ordering='scoring_detail__final_task_score')
    def get_final_score_display(self, obj):
        score = getattr(obj, 'scoring_detail', None)
        if score and score.final_task_score is not None:
            return f"{score.final_task_score:.1f}"
        return "-"

    @admin.display(description="دقیقه / بازدهی")
    def get_efficiency_combined(self, obj):
        try:
            percent = obj.efficiency_percentage
            diff = obj.estimated_minutes - obj.final_time
            color = "green" if diff >= 0 else "red"
            sign = "+" if diff >= 0 else ""
            return format_html('<div style="color:{}; font-weight: bold;">{}{} / {}%</div>', color, sign, diff, percent)
        except: return "-"

    @admin.display(description="وضعیت", ordering='status')
    def get_status_colored(self, obj):
        colors = {'done': 'green', 'doing': '#f39c12', 'suspended': '#f59e0b', 'pending': 'gray'}
        color = colors.get(obj.status, 'black')
        return format_html('<span style="color:{}; font-weight: bold;">{}</span>', color, obj.get_status_display())

    @admin.display(description='تاریخ', ordering='start_time')
    def get_jalali_start_date(self, obj):
        if obj.start_time:
            j = jdatetime.date.fromgregorian(date=obj.start_time.date())
            return f"{j.year}/{j.month:02d}/{j.day:02d}"
            return "-"


    def save_model(self, request, obj, form, change):
        # اگر سوپریوزر final_time را تغییر داد، آن را به عنوان مقدار دستی قفل کن
        if request.user.is_superuser and 'final_time' in form.changed_data:
            obj.manual_final_time = obj.final_time
        super().save_model(request, obj, form, change)

    def get_readonly_fields(self, request, obj=None):
        ro = list(super().get_readonly_fields(request, obj))
        if not request.user.is_superuser:
            ro.append('final_time')
        return ro


# --- 6. تنظیمات کاربر (User Admin) ---
class AttendanceInline(admin.TabularInline):
    model = Attendance
    extra = 0
    fields = ('date', 'get_start_inline', 'get_end_inline', 'get_formatted_duration')
    readonly_fields = ('date', 'get_start_inline', 'get_end_inline', 'get_formatted_duration')
    can_delete = False
    ordering = ('-date',)
    verbose_name = "سوابق روزانه"
    verbose_name_plural = "سوابق حضور و غیاب (خلاصه روزانه)"

    @admin.display(description='اولین ورود')
    def get_start_inline(self, obj):
        if obj.first_clock_in:
            return timezone.localtime(obj.first_clock_in).strftime("%H:%M")
        return "-"

    @admin.display(description='آخرین خروج')
    def get_end_inline(self, obj):
        if obj.last_clock_out:
            return timezone.localtime(obj.last_clock_out).strftime("%H:%M")
        return "-"

    @admin.display(description='مدت زمان (ساعت:دقیقه)')
    def get_formatted_duration(self, obj):
        if obj.total_seconds is None:
            return "00:00"
        hours = obj.total_seconds // 3600
        minutes = (obj.total_seconds % 3600) // 60
        return f"{hours:02}:{minutes:02}"

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'پروفایل تکمیلی'

class UserAdmin(BaseUserAdmin):
    inlines = (UserProfileInline, AttendanceInline)

    list_display = ('get_full_name', 'get_phone', 'get_daily_status', 'get_monthly_efficiency')
    search_fields = ('username', 'first_name', 'last_name', 'profile__phone')

    readonly_fields = ('last_login', 'date_joined', 'efficiency_history_chart')

    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        ('اطلاعات شخصی', {'fields': ('first_name', 'last_name', 'email')}),
        ('دسترسی‌ها', {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
        ('تواریخ مهم', {'fields': ('last_login', 'date_joined')}),
        ('عملکرد ۱۲ ماه گذشته', {'fields': ('efficiency_history_chart',)}),
    )

    @admin.display(description='نام و نام خانوادگی', ordering='first_name')
    def get_full_name(self, obj):
        return obj.get_full_name() or obj.username

    @admin.display(description='شماره تماس')
    def get_phone(self, obj):
        try:
            return obj.profile.phone
        except:
            return "-"

    @admin.display(description='وضعیت روزانه')
    def get_daily_status(self, obj):
        try:
            return obj.profile.daily_status
        except:
            return "-"

    @admin.display(description='بازدهی ۳۰ روز اخیر')
    def get_monthly_efficiency(self, obj):
        thirty_days_ago = timezone.now() - timedelta(days=30)
        logs = WorkLog.objects.filter(
            user=obj,
            start_time__gte=thirty_days_ago,
            status='done'
        )

        count = logs.count()
        if count == 0: return "-"

        total_percent = 0
        for log in logs:
            total_percent += log.efficiency_percentage

        avg_percent = int(total_percent / count)

        if avg_percent > 0:
            return format_html('<div style="color:green; font-weight:bold;">+{}%</div>', avg_percent)
        elif avg_percent < 0:
            return format_html('<div style="color:red; font-weight:bold;">{}%</div>', avg_percent)
        else:
            return mark_safe('<div style="color:gray; font-weight:bold;">0%</div>')

    @admin.display(description='جدول بازدهی ماهانه')
    def efficiency_history_chart(self, obj):
        html = """
        <table style="width: 100%; border-collapse: collapse; margin-top: 10px; text-align: center;">
            <thead>
                <tr style="background-color: #f8f9fa; border-bottom: 2px solid #dee2e6;">
                    <th style="padding: 10px; border: 1px solid #ddd;">ماه</th>
                    <th style="padding: 10px; border: 1px solid #ddd;">تعداد کار</th>
                    <th style="padding: 10px; border: 1px solid #ddd;">زمان استاندارد</th>
                    <th style="padding: 10px; border: 1px solid #ddd;">زمان واقعی</th>
                    <th style="padding: 10px; border: 1px solid #ddd;">بازدهی (میانگین)</th>
                </tr>
            </thead>
            <tbody>
        """

        today = timezone.now()

        for i in range(12):
            year = today.year
            month = today.month - i
            while month <= 0:
                month += 12
                year -= 1

            start_date = today.replace(year=year, month=month, day=1, hour=0, minute=0, second=0)
            last_day = calendar.monthrange(year, month)[1]
            end_date = today.replace(year=year, month=month, day=last_day, hour=23, minute=59, second=59)

            j_date = jdatetime.date.fromgregorian(date=start_date)
            month_name = j_date.strftime("%B %Y")

            logs = WorkLog.objects.filter(
                user=obj,
                start_time__range=(start_date, end_date),
                status='done'
            )

            count = logs.count()
            sum_est = 0
            sum_act = 0
            total_percent = 0

            for log in logs:
                sum_est += (log.estimated_minutes or 0)
                sum_act += log.actual_minutes_display
                total_percent += log.efficiency_percentage

            percent_display = "-"
            bg_color = "#fff"
            text_color = "#000"

            if count > 0:
                avg_percent = int(total_percent / count)
                if avg_percent > 0:
                    percent_display = f"+{avg_percent}%"
                    bg_color = "#d4edda"
                    text_color = "#155724"
                elif avg_percent < 0:
                    percent_display = f"{avg_percent}%"
                    bg_color = "#f8d7da"
                    text_color = "#721c24"
                else:
                    percent_display = "0%"
                    text_color = "gray"
            
            html += f"""
                <tr style="border-bottom: 1px solid #eee;">
                    <td style="padding: 8px; border: 1px solid #ddd;">{month_name}</td>
                    <td style="padding: 8px; border: 1px solid #ddd;">{count}</td>
                    <td style="padding: 8px; border: 1px solid #ddd;">{sum_est} دقیقه</td>
                    <td style="padding: 8px; border: 1px solid #ddd;">{sum_act} دقیقه</td>
                    <td style="padding: 8px; border: 1px solid #ddd; background-color: {bg_color}; color: {text_color}; font-weight: bold; direction: ltr;">{percent_display}</td>
                </tr>
            """

        html += "</tbody></table>"
        return mark_safe(html)
    def get_inlines(self, request, obj=None):
        if not obj:
            return []
        return self.inlines

admin.site.unregister(User)
admin.site.register(User, UserAdmin)