"""
View для импорта товаров из CSV/XLSX файлов.
"""
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, JsonResponse
from django.views.decorators.http import require_http_methods
from django.core.files.storage import default_storage
from django.db import connection
import os

from ..models import ProductImportJob
from ..tasks import import_products_async


@login_required
@require_http_methods(["GET", "POST"])
def product_import_view(request):
    """
    Импорт товаров из CSV/XLSX файла (асинхронно через Celery).
    
    GET: показывает форму загрузки
    POST: сохраняет файл и запускает асинхронную задачу
    """
    if request.method == "POST":
        uploaded_file = request.FILES.get('file')
        update_existing = request.POST.get('update_existing') == 'on'
        
        if not uploaded_file:
            messages.error(request, "Пожалуйста, выберите файл для загрузки.")
            return render(request, 'products/product_import.html')
        
        try:
            # Сохраняем файл во временную директорию
            file_name = uploaded_file.name
            temp_dir = 'products/import_temp'
            file_path = os.path.join(temp_dir, f"{request.user.id}_{file_name}")
            
            # Создаём директорию если не существует
            full_dir = os.path.dirname(default_storage.path(file_path))
            os.makedirs(full_dir, exist_ok=True)
            
            # Сохраняем файл
            saved_path = default_storage.save(file_path, uploaded_file)
            
            # Получаем schema_name для мультитенантности
            schema_name = connection.schema_name
            
            # Создаём задачу импорта
            job = ProductImportJob.objects.create(
                task_id='',  # Заполнится после запуска
                user=request.user,
                file_name=file_name,
                file_path=saved_path,
                update_existing=update_existing,
                status='pending'
            )
            
            # Запускаем асинхронную задачу Celery
            task = import_products_async.delay(
                job_id=job.id,
                file_path=saved_path,
                update_existing=update_existing,
                schema_name=schema_name
            )
            
            # Обновляем task_id
            job.task_id = task.id
            job.save(update_fields=['task_id'])
            
            messages.success(request, f"Импорт запущен! Отслеживайте прогресс...")
            
            # Редирект на страницу статуса
            return redirect('products:product-import-status', job_id=job.id)
            
        except Exception as exc:
            messages.error(request, f"Ошибка запуска импорта: {exc}")
            return render(request, 'products/product_import.html')
    
    # GET request
    return render(request, 'products/product_import.html')


@login_required
def product_import_status_view(request, job_id):
    """
    Страница отслеживания статуса импорта.
    """
    job = get_object_or_404(ProductImportJob, id=job_id)
    
    context = {
        'job': job,
    }
    
    return render(request, 'products/product_import_status.html', context)


@login_required
def product_import_status_api(request, job_id):
    """
    API endpoint для получения статуса импорта (для AJAX polling).
    """
    job = get_object_or_404(ProductImportJob, id=job_id)
    
    data = {
        'status': job.status,
        'progress_percent': job.progress_percent,
        'total_rows': job.total_rows,
        'processed_rows': job.processed_rows,
        'created_count': job.created_count,
        'updated_count': job.updated_count,
        'skipped_count': job.skipped_count,
        'errors_count': job.errors_count,
        'error_message': job.error_message,
        'is_finished': job.status in ['completed', 'failed'],
    }
    
    return JsonResponse(data)


@login_required
def download_import_errors(request):
    """
    Скачивание файла с ошибками импорта.
    Генерирует файл с невалидными строками из последнего импорта.
    """
    import_errors = request.session.get('import_errors', [])
    
    if not import_errors:
        messages.error(request, "Нет ошибок для скачивания.")
        return redirect('products:product_import')
    
    # Создаём временный importer для генерации файла
    # (нужны original_headers и original_rows, но их нет в сессии)
    # Упрощённый вариант: возвращаем просто список ошибок в CSV
    
    import csv
    from io import StringIO
    from django.utils import timezone
    
    output = StringIO()
    output.write('\ufeff')  # BOM
    
    writer = csv.writer(output)
    writer.writerow(['Строка', 'Название', 'Артикул', 'Причина ошибки'])
    
    for error in import_errors:
        writer.writerow([
            error.get('row', ''),
            error.get('name', ''),
            error.get('sku', ''),
            error.get('reason', ''),
        ])
    
    content = output.getvalue().encode('utf-8')
    
    response = HttpResponse(content, content_type='text/csv; charset=utf-8')
    timestamp = timezone.now().strftime("%Y%m%d_%H%M%S")
    response['Content-Disposition'] = f'attachment; filename="product_import_errors_{timestamp}.csv"'
    
    # Очищаем сессию
    request.session.pop('import_errors', None)
    request.session.pop('import_has_error_file', None)
    
    return response
