"""
from decimal import Decimal
import json
import locale
from django.db.models import Count, Sum, Avg, F, ExpressionWrapper, DecimalField
from django.shortcuts import get_object_or_404, render, redirect
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.db import transaction
from django.contrib.auth.hashers import make_password
from django.contrib.auth.decorators import login_required
locale.setlocale(locale.LC_ALL, 'es_CO.UTF-8')
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.contrib.auth import logout
from django.contrib import messages
from django import forms
from django.core.exceptions import ValidationError
import re

class CustomUserCreationForm(UserCreationForm):
    email = forms.EmailField(
        required=True,
        widget=forms.EmailInput(attrs={
            'class': 'form-control', 
            'placeholder': 'Correo electrónico'
        })
    )
    
    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")
    
    def clean_email(self):
        email = self.cleaned_data.get('email')
        if User.objects.filter(email=email).exists():
            raise ValidationError("Este correo electrónico ya está registrado.")
        return email
    
    def clean_password1(self):
        password1 = self.cleaned_data.get('password1')
        
        # Validaciones adicionales de contraseña
        if len(password1) < 8:
            raise ValidationError("La contraseña debe tener al menos 8 caracteres.")
        if not re.search('[A-Z]', password1):
            raise ValidationError("La contraseña debe contener al menos una mayúscula.")
        if not re.search('[a-z]', password1):
            raise ValidationError("La contraseña debe contener al menos una minúscula.")
        if not re.search('[0-9]', password1):
            raise ValidationError("La contraseña debe contener al menos un número.")
        if not re.search('[^A-Za-z0-9]', password1):
            raise ValidationError("La contraseña debe contener al menos un carácter especial.")
            
        return password1

def registro_view(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            return redirect('login')
    else:
        form = CustomUserCreationForm()
    
    return render(request, 'registration/registro.html', {'form': form})

def custom_logout(request):
    logout(request)
    return redirect('login')

"""
from django.contrib import messages
from django.http import HttpResponse
from django.apps import apps
from django.shortcuts import redirect
from django.views.decorators.csrf import csrf_exempt, csrf_protect
import openpyxl

MODELO_MAP = {
    'unidad_medida': 'listas_configuracion.UnidadMedida',
    'forma_pago': 'listas_configuracion.FormaPago',
    'empaque_compra': 'listas_configuracion.EmpaqueCompra',
    'empaque_produccion': 'listas_configuracion.EmpaqueProduccion',
    'clasificacion_producto': 'listas_configuracion.ClasificacionProducto',
    'grupo_producto': 'listas_configuracion.GrupoProducto',
    'proveedor': 'proveedores.Proveedor',
}

def descargar_plantilla_excel(request, modelo):
    modelo_path = MODELO_MAP.get(modelo)
    if not modelo_path:
        return HttpResponse("Modelo no válido", status=400)

    app_label, model_name = modelo_path.split(".")
    modelo_clase = apps.get_model(app_label, model_name)
    if not modelo_clase:
        return HttpResponse("Modelo no encontrado", status=404)

    # Crear Excel
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = "Plantilla"

    campos = [f.name for f in modelo_clase._meta.fields if f.editable and f.name != 'id']
    ws.append(campos)

    response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    response['Content-Disposition'] = f'attachment; filename="plantilla_{modelo}.xlsx"'
    wb.save(response)
    return response


def importar_plantilla_excel(request):
    if request.method != 'POST':
        return redirect('/admin/')

    modelo_key = request.POST.get('modelo')
    archivo = request.FILES.get('archivo')

    if not modelo_key or not archivo:
        messages.error(request, "Debes seleccionar un modelo y subir un archivo.")
        return redirect('/admin/')

    modelo_path = MODELO_MAP.get(modelo_key)
    if not modelo_path:
        messages.error(request, "Modelo no válido.")
        return redirect('/admin/')

    try:
        app_label, model_name = modelo_path.split(".")
        modelo_clase = apps.get_model(app_label, model_name)

        wb = openpyxl.load_workbook(archivo)
        ws = wb.active
        filas = list(ws.iter_rows(values_only=True))
        encabezados = filas[0]
        registros = filas[1:]

        creados = 0
        for fila in registros:
            data = dict(zip(encabezados, fila))
            modelo_clase.objects.create(**data)
            creados += 1

        messages.success(request, f"Se importaron {creados} registros correctamente en {modelo_key}.")
    except Exception as e:
        messages.error(request, f"Error al importar el archivo: {str(e)}")

    return redirect('/admin/')