from django.contrib import admin
from django.utils.html import format_html
from django.shortcuts import render
from django.http import HttpResponse
from django.urls import path
from django import forms
from .models import Student, Candidate, Vote
import openpyxl
from io import BytesIO


class ExcelImportForm(forms.Form):
    excel_file = forms.FileField(
        label='Pilih file Excel',
        help_text='Format: .xlsx, .xls. Kolom: NISN, Nama, Kelas, Jurusan',
        widget=forms.FileInput(attrs={'accept': '.xlsx,.xls'})
    )


@admin.register(Student)
class StudentAdmin(admin.ModelAdmin):
    app_label = 'voting'
    list_display = ('nisn', 'nama', 'kelas', 'jurusan', 'get_status_vote', 'created_at')
    list_filter = ('kelas', 'jurusan', 'sudah_memilih')
    search_fields = ('nisn', 'nama')
    list_per_page = 25
    ordering = ('-created_at',)
    readonly_fields = ('created_at',)

    fieldsets = (
        ('Data Siswa', {
            'fields': ('nisn', 'nama', 'kelas', 'jurusan')
        }),
        ('Status Voting', {
            'fields': ('sudah_memilih',)
        }),
    )

    actions = ['mark_as_voted', 'mark_as_not_voted', 'import_excel']

    @admin.display(description='Status Vote', ordering='sudah_memilih')
    def get_status_vote(self, obj):
        return 'Sudah Memilih' if obj.sudah_memilih else 'Belum Memilih'

    @admin.action(description='Tandai siswa sudah memilih')
    def mark_as_voted(self, request, queryset):
        count = queryset.update(sudah_memilih=True)
        self.message_user(request, f'{count} siswa ditandai sudah memilih.')

    @admin.action(description='Tandai siswa belum memilih')
    def mark_as_not_voted(self, request, queryset):
        count = queryset.update(sudah_memilih=False)
        self.message_user(request, f'{count} siswa ditandai belum memilih.')

    @admin.action(description='Import dari Excel')
    def import_excel(self, request, queryset=None):
        if request.method == 'POST':
            form = ExcelImportForm(request.POST, request.FILES)
            if form.is_valid():
                excel_file = request.FILES['excel_file']
                try:
                    wb = openpyxl.load_workbook(excel_file)
                    ws = wb.active
                    rows = list(ws.iter_rows(min_row=2, values_only=True))  # Skip header

                    imported_count = 0
                    skipped_count = 0
                    errors = []

                    for i, row in enumerate(rows, start=2):
                        if not row[0]:  # Skip empty rows
                            continue

                        nisn = str(row[0]).strip() if row[0] else None
                        nama = str(row[1]).strip() if row[1] else None
                        kelas = str(row[2]).strip() if row[2] else None
                        jurusan = str(row[3]).strip() if row[3] else None

                        if not nisn or not nama:
                            errors.append(f"Baris {i}: NISN atau Nama kosong")
                            continue

                        _, created = Student.objects.get_or_create(
                            nisn=nisn,
                            defaults={
                                'nama': nama,
                                'kelas': kelas or '',
                                'jurusan': jurusan or '',
                                'sudah_memilih': False,
                            }
                        )
                        if created:
                            imported_count += 1
                        else:
                            skipped_count += 1

                    msg = f"Berhasil import {imported_count} siswa. {skipped_count} duplikat dilewati."
                    if errors:
                        msg += f" {len(errors)} error."
                        self.message_user(request, msg + f"\n" + "\n".join(errors[:10]), level='WARNING')
                    else:
                        self.message_user(request, msg)

                except Exception as e:
                    self.message_user(request, f"Error: {str(e)}", level='ERROR')
                return None
        else:
            form = ExcelImportForm()

        context = {
            'form': form,
            'title': 'Import Data Siswa dari Excel',
            'subtitle': 'Upload file Excel dengan kolom: NISN, Nama, Kelas, Jurusan',
        }
        return render(request, 'admin/excel_import.html', context)

    def download_template(self, request):
        wb = openpyxl.Workbook()
        ws = wb.active
        ws.title = "Template Siswa"

        # Header
        headers = ['NISN', 'Nama', 'Kelas', 'Jurusan']
        ws.append(headers)

        # Style header
        for cell in ws[1]:
            cell.font = openpyxl.styles.Font(bold=True, color='FFFFFF')
            cell.fill = openpyxl.styles.PatternFill(start_color='667eea', end_color='667eea', fill_type='solid')
            cell.alignment = openpyxl.styles.Alignment(horizontal='center')

        # Column width
        ws.column_dimensions['A'].width = 15
        ws.column_dimensions['B'].width = 25
        ws.column_dimensions['C'].width = 12
        ws.column_dimensions['D'].width = 12

        output = BytesIO()
        wb.save(output)
        output.seek(0)

        response = HttpResponse(output, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
        response['Content-Disposition'] = 'attachment; filename="template_import_siswa.xlsx"'
        return response

    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path('download-template/', self.download_template, name='download_student_template'),
            path('import-excel/', self.import_excel_view, name='import_student_excel'),
        ]
        return custom_urls + urls

    def import_excel_view(self, request):
        """Direct view for Excel import page"""
        if request.method == 'POST':
            form = ExcelImportForm(request.POST, request.FILES)
            if form.is_valid():
                excel_file = request.FILES['excel_file']
                try:
                    wb = openpyxl.load_workbook(excel_file)
                    ws = wb.active
                    rows = list(ws.iter_rows(min_row=2, values_only=True))

                    imported_count = 0
                    skipped_count = 0
                    errors = []

                    for i, row in enumerate(rows, start=2):
                        if not row[0]:
                            continue

                        nisn = str(row[0]).strip() if row[0] else None
                        nama = str(row[1]).strip() if row[1] else None
                        kelas = str(row[2]).strip() if row[2] else None
                        jurusan = str(row[3]).strip() if row[3] else None

                        if not nisn or not nama:
                            errors.append(f"Baris {i}: NISN atau Nama kosong")
                            continue

                        _, created = Student.objects.get_or_create(
                            nisn=nisn,
                            defaults={
                                'nama': nama,
                                'kelas': kelas or '',
                                'jurusan': jurusan or '',
                                'sudah_memilih': False,
                            }
                        )
                        if created:
                            imported_count += 1
                        else:
                            skipped_count += 1

                    msg = f"Berhasil import {imported_count} siswa. {skipped_count} duplikat dilewati."
                    if errors:
                        msg += f" {len(errors)} error."
                        self.message_user(request, msg + "\n" + "\n".join(errors[:10]), level='WARNING')
                    else:
                        self.message_user(request, msg)

                except Exception as e:
                    self.message_user(request, f"Error: {str(e)}", level='ERROR')
                return None
        else:
            form = ExcelImportForm()

        context = {
            'form': form,
            'title': 'Import Data Siswa dari Excel',
            'subtitle': 'Upload file Excel dengan kolom: NISN, Nama, Kelas, Jurusan',
        }
        return render(request, 'admin/excel_import.html', context)


@admin.register(Candidate)
class CandidateAdmin(admin.ModelAdmin):
    app_label = 'voting'
    list_display = ('get_foto', 'nama', 'get_visi', 'jumlah_suara', 'is_active', 'created_at')
    list_filter = ('is_active',)
    search_fields = ('nama',)
    list_per_page = 25
    ordering = ('-jumlah_suara',)
    readonly_fields = ('created_at', 'updated_at')


    fieldsets = (
        ('Data Kandidat', {
            'fields': ('nama', 'foto', 'is_active')
        }),
        ('Visi Misi', {
            'fields': ('visi', 'misi')
        }),
        ('Statistik', {
            'fields': ('jumlah_suara',),
            'classes': ('collapse',)
        }),
        ('Info Sistem', {
            'fields': ('created_at', 'updated_at'),
            'classes': ('collapse',)
        }),
    )

    @admin.display(description='Foto')
    def get_foto(self, obj):
        if obj.foto and hasattr(obj.foto, 'url'):
            return format_html(
                '<img src="{}" width="50" height="50" style="border-radius:5px;" />',
                obj.foto.url
            )
        return '-'

    @admin.display(description='Visi')
    def get_visi(self, obj):
        if not obj.visi:
            return '-'
        return f'{obj.visi[:40]}...' if len(obj.visi) > 40 else obj.visi

    actions = ['activate_selected', 'deactivate_selected']

    @admin.action(description='Aktifkan kandidat')
    def activate_selected(self, request, queryset):
        count = queryset.update(is_active=True)
        self.message_user(request, f'{count} kandidat diaktifkan.')

    @admin.action(description='Nonaktifkan kandidat')
    def deactivate_selected(self, request, queryset):
        count = queryset.update(is_active=False)
        self.message_user(request, f'{count} kandidat dinonaktifkan.')


@admin.register(Vote)
class VoteAdmin(admin.ModelAdmin):
    app_label = 'voting'
    list_display = ('id', 'student', 'candidate', 'timestamp')
    list_filter = ('candidate',)
    search_fields = ('student__nama', 'student__nisn', 'candidate__nama')
    list_per_page = 30
    ordering = ('-timestamp',)
    readonly_fields = ('timestamp',)

    fieldsets = (
        ('Data Voting', {
            'fields': ('student', 'candidate')
        }),
        ('Waktu', {
            'fields': ('timestamp',)
        }),
    )

    def has_add_permission(self, request):
        return False


# Admin site customization
admin.site.site_header = 'Admin Sistem Voting OSIM'
admin.site.site_title = 'Pemilos Admin'
admin.site.index_title = 'Dashboard Statistik Voting'