import logging
import os
import uuid

from django.conf import settings
from django.contrib.auth.models import User
from django.db import models
from django.dispatch import receiver

from pycs_api.models import base
from pycs_api.models.label_provider import LabelProvider
from pycs_api.models.model import Model

def new_root_folder():
    return f"{settings.PROJECTS_DIR}/{uuid.uuid4()}"

class Project(base.BaseModel):


    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name="projects",
        related_query_name="project",
    )

    description = models.TextField()

    created = models.DateTimeField(auto_now_add=True)

    model = models.ForeignKey(
        Model,
        null=True,
        blank=True,
        on_delete=models.SET_NULL
    )

    label_provider = models.ForeignKey(
        LabelProvider,
        null=True,
        blank=True,
        on_delete=models.SET_NULL
    )

    root_folder = models.CharField(max_length=255,
        default=new_root_folder,
        unique=True)

    data_folder = models.CharField(max_length=255)

    external_data = models.BooleanField(default=False)

    serializer_fields = base.BaseModel.serializer_fields + [
        "description",
        "created",
        "model",
        "label_provider",
        "data_folder",
        "root_folder",
    ]
    read_only_fields = base.BaseModel.read_only_fields + [
        "created",
        "data_folder",
        "root_folder",
    ]


@receiver(models.signals.pre_save, sender=Project)
def project_pre_save(sender, instance, **kwargs):
    is_external = instance.data_folder != ''

    logging.info(f"Using external folder: {'yes' if is_external else 'no'}")
    instance.external_data = is_external

    os.makedirs(instance.root_folder, exist_ok=True)
    if not is_external:
        logging.info("Setting data folder")
        instance.data_folder = instance.root_folder + "/data"

    if not os.path.exists(instance.data_folder):
        os.makedirs(instance.data_folder, exist_ok=True)




    # TODO: copy model to root_folder / "model"
    # TODO: create temp folder root_folder / "temp"