# views.py:
from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from django.contrib.auth import authenticate, login, logout
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from .models import Column, Task
import json
from django.db import transaction # --- ADD THIS IMPORT ---


# --- Kanban Board View ---
@login_required(login_url='/login/')
def board(request):
    # --- UPDATED TO PREFETCH AND ORDER TASKS ---
    columns = Column.objects.prefetch_related('tasks').all().order_by('order')
    return render(request, 'kanban/board.html', {'columns': columns, 'user': request.user})


# --- User Login View (No changes) ---
def user_login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('board')
        else:
            return render(request, 'kanban/login.html', {'error': 'Invalid credentials'})
    return render(request, 'kanban/login.html')


# --- User Logout View (No changes) ---
def user_logout(request):
    logout(request)
    return redirect('login')


# --- (DELETED) The old 'move_task' view is removed ---


# --- ADDED: Robust Task Ordering (Drag & Drop) ---
@csrf_exempt
@login_required(login_url='/login/')
@transaction.atomic # Ensures all updates succeed or fail together
def update_task_order(request):
    """
    Handles drag & drop for both re-ordering and moving between columns.
    Expects JSON: {
        "column_id": <id>, 
        "ordered_task_ids": ["task-3", "task-1", "task-2"]
    }
    """
    if request.method == 'POST':
        try:
            data = json.loads(request.body)
            column_id = data.get('column_id')
            # Get task IDs from "task-1" to "1"
            ordered_task_ids = [int(tid.split('-')[-1]) for tid in data.get('ordered_task_ids', [])]

            new_column = Column.objects.get(id=column_id)

            for index, task_id in enumerate(ordered_task_ids):
                # Update each task with its new column and order
                Task.objects.filter(id=task_id).update(column=new_column, order=index)
                
            return JsonResponse({'status': 'success'})
        except (Column.DoesNotExist):
            return JsonResponse({'status': 'error', 'message': 'Invalid column ID'}, status=400)
        except Exception as e:
            return JsonResponse({'status': 'error', 'message': str(e)}, status=500)

    return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)


# --- Update Task (Modal) AJAX Endpoint (No changes) ---
@csrf_exempt
@login_required(login_url='/login/')
def update_task(request):
    """
    Handles updating task title/description from the modal.
    """
    if request.method == 'POST':
        try:
            data = json.loads(request.body)
            task_id = data.get('task_id')
            title = data.get('title')
            description = data.get('description')

            task = Task.objects.get(id=task_id)
            task.title = title
            task.description = description
            task.save()

            return JsonResponse({'status': 'success'})
        except Task.DoesNotExist:
            return JsonResponse({'status': 'error', 'message': 'Task not found'}, status=404)
        except Exception as e:
            return JsonResponse({'status': 'error', 'message': str(e)}, status=500)
    
    return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)


# --- Toggle Task Completion AJAX Endpoint (No changes) ---
@csrf_exempt
@login_required(login_url='/login/')
def toggle_task_complete(request):
    """
    Handles toggling the is_completed status of a task.
    """
    if request.method == 'POST':
        try:
            data = json.loads(request.body)
            task_id = data.get('task_id')

            task = Task.objects.get(id=task_id)
            task.is_completed = not task.is_completed
            task.save()

            return JsonResponse({'status': 'success', 'is_completed': task.is_completed})
        except Task.DoesNotExist:
            return JsonResponse({'status': 'error', 'message': 'Task not found'}, status=404)
        except Exception as e:
            return JsonResponse({'status': 'error', 'message': str(e)}, status=500)

    return JsonResponse({'status': 'error', 'message': 'Invalid request method'}, status=400)