import os
from uuid import uuid4

from django.db import models
from django.core.files.storage import FileSystemStorage
from django.conf import settings

from apps.core.models import TimeStampedModel, Visibility


class PrivateFileStorage(FileSystemStorage):
    def __init__(self, *args, **kwargs):
        kwargs.setdefault("location", str(settings.PRIVATE_MEDIA_ROOT))
        kwargs.setdefault("base_url", None)
        super().__init__(*args, **kwargs)

    def url(self, name):
        return ""


private_storage = PrivateFileStorage()


def private_upload_to(instance, filename):
    ext = os.path.splitext(filename)[1]
    return f"documents/{instance.category}/{uuid4().hex}{ext}"


class DocumentCategory(models.TextChoices):
    AGREEMENT = "agreement", "Investment Agreement"
    LEGAL = "legal", "Legal"
    STATEMENT = "statement", "Statement"
    RECEIPT = "receipt", "Receipt"
    PROJECT = "project", "Project"
    KYC = "kyc", "Identity / KYC"
    OTHER = "other", "Other"


class Document(TimeStampedModel):
    title = models.CharField(max_length=180)
    category = models.CharField(max_length=20, choices=DocumentCategory.choices, default=DocumentCategory.OTHER)
    visibility = models.CharField(max_length=16, choices=Visibility.choices, default=Visibility.INVESTOR)
    file = models.FileField(storage=private_storage, upload_to=private_upload_to, blank=True)
    original_name = models.CharField(max_length=180, blank=True)
    mime_type = models.CharField(max_length=80, blank=True)
    meta = models.CharField(max_length=255, blank=True)
    investor = models.ForeignKey(
        "investors.Investor",
        null=True,
        blank=True,
        on_delete=models.CASCADE,
        related_name="documents",
    )
    project = models.ForeignKey(
        "projects.Project",
        null=True,
        blank=True,
        on_delete=models.CASCADE,
        related_name="secure_documents",
    )
    investment = models.ForeignKey(
        "investments.Investment",
        null=True,
        blank=True,
        on_delete=models.CASCADE,
        related_name="documents",
    )
    uploaded_by = models.ForeignKey(
        "accounts.User",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="uploaded_documents",
    )

    class Meta:
        ordering = ["-created_at"]

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if self.file and not self.original_name:
            self.original_name = os.path.basename(self.file.name)
        super().save(*args, **kwargs)
