"""
Admin views for product deduplication.
Staff-only pages.
"""

import json

from django.contrib.admin.views.decorators import staff_member_required
from django.http import JsonResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_POST

from notas.dedup import find_duplicate_candidates, merge_products


@staff_member_required
def dedup_page(request):
    """
    GET /notas/dedup/ — Render the product deduplication admin page.
    Finds duplicate candidates and displays them for admin review.
    """
    threshold = float(request.GET.get('threshold', 0.85))
    candidates = find_duplicate_candidates(threshold=threshold)
    context = {
        'candidates': candidates,
        'threshold': threshold,
        'total_groups': len(candidates),
        'title': 'Deduplicação de Produtos',
    }
    return render(request, 'notas/dedup.html', context)


@csrf_exempt
@staff_member_required
@require_POST
def dedup_merge(request):
    """
    POST /notas/dedup/merge/ — Merge duplicate products.
    Expects JSON body: { "canonical_id": int, "duplicate_ids": [int, ...] }
    """
    try:
        body = json.loads(request.body)
    except (json.JSONDecodeError, ValueError):
        return JsonResponse({'error': 'JSON inválido.'}, status=400)

    canonical_id = body.get('canonical_id')
    duplicate_ids = body.get('duplicate_ids', [])

    if not canonical_id or not duplicate_ids:
        return JsonResponse({'error': 'canonical_id e duplicate_ids são obrigatórios.'}, status=400)

    try:
        canonical_id = int(canonical_id)
        duplicate_ids = [int(d) for d in duplicate_ids]
    except (ValueError, TypeError):
        return JsonResponse({'error': 'IDs devem ser números inteiros.'}, status=400)

    # Safety: don't merge canonical into itself
    duplicate_ids = [d for d in duplicate_ids if d != canonical_id]
    if not duplicate_ids:
        return JsonResponse({'error': 'Nenhuma duplicata válida para mesclar.'}, status=400)

    result = merge_products(canonical_id, duplicate_ids)
    return JsonResponse(result)
