from django.contrib.auth.decorators import login_required
from django.conf import settings 
from django.http import HttpResponseForbidden
from django.shortcuts import render, redirect, get_object_or_404
from .forms import newDatasetForm, EditDatasetForm
import os
import zipfile



from .models import Dataset
# Create your views here.

def test(request):
    return render(request, 'dataset/edit.html')


def detail(request, slug):
    dataset = get_object_or_404(Dataset, slug=slug)
    
    if dataset.hidden and not request.user.is_staff:
        return HttpResponseForbidden("Access denied")

    file_path = dataset.data.url
    umap_path = dataset.cellTypeImage.url
    umap_path2 = dataset.cellTypeImage2.url if dataset.multiImage and dataset.cellTypeImage2 else None

    return render(request, 'dataset/detail.html', {
        'dataset': dataset,
        'file_path': file_path,
        'umap_path': umap_path,
        'umap_path2': umap_path2,
    })



@login_required(login_url='/login/')
def new(request):
    if request.method == 'POST':
        form = newDatasetForm(request.POST, request.FILES)

        if form.is_valid():
            # Save the form without committing to the database
            dataset = form.save(commit=False)
            dataset.created_by = request.user

            uploaded_file = request.FILES['data']

            # Get the original file name (assuming it's a zip file)
            original_filename = uploaded_file.name

            # Remove the ".zip" extension to get the subfolder name
            subfolder_name = os.path.splitext(original_filename)[0]

            # Create a unique directory for the dataset using its name
            dataset_name = dataset.name

            # Construct the full path to the dataset directory within MEDIA_ROOT, including the subfolder
            dataset_dir = os.path.join(settings.MEDIA_ROOT, 'datasets', dataset_name)
            os.makedirs(dataset_dir, exist_ok=True)

            # Unzip the uploaded ZIP file into the dataset's directory
            with zipfile.ZipFile(uploaded_file, 'r') as zip_ref:
                zip_ref.extractall(dataset_dir)

            # Update the dataset's data field with the path relative to MEDIA_ROOT
            dataset.data = os.path.relpath(dataset_dir, settings.MEDIA_ROOT)

            # Write the subfolder name to the 'subfolder' field
            dataset.subfolder = subfolder_name

            # Save the dataset to the database
            dataset.save()

            return redirect('dataset:dataset_detail', slug=dataset.slug)
    else:
        form = newDatasetForm()

    return render(request, 'upload.html', {
        'form': form,
        'title': 'New dataset',
    })

@login_required
def delete(request, pk):
    dataset = get_object_or_404(Dataset, pk=pk, created_by=request.user)
    dataset.delete()

    return redirect('../../../dashboard/')

@login_required
def edit(request):
    dataset = get_object_or_404(Dataset, created_by=request.user)
    if request.method == 'POST':
        form = EditDatasetForm(request.POST, instance=dataset)
        if form.is_valid():
            dataset.save()

            return redirect('dataset:dataset_label', dataset_id=dataset.id)
    else:
        form = EditDatasetForm()
    
    return render(request, 'dataset/label.html', {
        'form':form,
    })