from django.db import models
from django.utils import timezone
from django.conf import settings
import os

class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
        default=timezone.now)
    published_date = models.DateTimeField(
        null=True, blank=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title


class ProjectDates(models.Model):
    start_date = models.DateField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)

    class Meta:
        unique_together = ['start_date', 'end_date']

    def __str__(self):
        return ' - '.join([str(self.start_date), str(self.end_date)])


class Role(models.Model):
    name = models.CharField(max_length=200)
    character = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        if self.name == 'Actor' and self.character is not None:
            string = self.character
        else:
            string = self.name
        return str(string)

    unique_together = ['name', 'character']


class Location(models.Model):
    name = models.CharField(max_length=200, unique=True)

    def __str__(self):
        return safe_name(self.name)


class Organization(models.Model):
    name = models.CharField(max_length=200)
    location = models.ForeignKey(
        Location, null=True, blank=True, on_delete=models.SET_NULL)

    def __str__(self):
        return safe_name(self.name)

    class Meta:
        unique_together = ['name', 'location']


class ProjectLocation(models.Model):
    organization = models.ForeignKey(
        Organization, null=True, blank=True, on_delete=models.SET_NULL)
    sub_location = models.ForeignKey(
        Location, null=True, blank=True, on_delete=models.SET_NULL)

    def __str__(self):
        return ' - '.join([str(self.organization), str(self.sub_location)])

    class Meta:
        unique_together = ['organization', 'sub_location']


class Award(models.Model):
    name = models.CharField(max_length=200)
    organization = models.ManyToManyField(Organization)
    note = models.TextField(null=True, blank=True)

    def __str__(self):
        return safe_name(self.name)


class Person(models.Model):
    prefix = models.CharField(max_length=20, null=True, blank=True)
    first_name = models.CharField(max_length=50, null=True, blank=True)
    middle_name = models.CharField(max_length=50, null=True, blank=True)
    last_name = models.CharField(max_length=50, null=True, blank=True)
    suffix = models.CharField(max_length=20, null=True, blank=True)
    note = models.TextField(null=True, blank=True)
    awards = models.ManyToManyField(Award, blank=True)

    @property
    def name(self):
        names = [self.prefix, self.first_name, self.middle_name, self.last_name,
                 self.suffix]
        names = [n for n in names if len(n) > 0]
        return ' '.join(names)

    def __str__(self):
        return safe_name(self.name)

    class Meta:
        unique_together = ['prefix', 'first_name',
                           'middle_name', 'last_name', 'suffix']


class Collaborator(models.Model):
    role = models.ForeignKey(
        Role, null=True, blank=True, on_delete=models.SET_NULL)
    person = models.ForeignKey(
        Person, null=True, blank=True, on_delete=models.SET_NULL)

    def __str__(self):
        return ''.join([str(self.person), ' (', str(self.role), ') '])

    class Meta:
        unique_together = ['role', 'person']


class Show(models.Model):
    name = models.CharField(max_length=200)
    playwrights = models.ManyToManyField(Person)
    publication_date = models.DateTimeField(null=True, blank=True)
    note = models.TextField(null=True, blank=True)

    class Meta:
        unique_together = ['name', 'publication_date']

    def __str__(self):
        return safe_name(self.name)


class Quote(models.Model):
    txt = models.TextField(null=True, blank=True)
    person = models.ForeignKey(Person, null=True, blank=True)
    organization = models.ForeignKey(Organization, null=True, blank=True)
    extra_attribution_details = models.TextField(null=True, blank=True)
    date = models.DateField(null=True, blank=True)

    def __str__(self):
        return ' '.join([self.txt,
                         '\n-', str(self.person),  '(', str(self.date), ')'])


class DbMedia(models.Model):
    media_file = models.CharField(max_length=20)

    class Meta:
        abstract = True

    def __str__(self):
        return safe_name(self.name)


class DbImage(DbMedia):
    name = models.CharField(max_length=50, null=True, blank=True, unique=True)
    media_file = models.ImageField(upload_to='uploaded_images')
    caption = models.TextField(blank=True)
    alt_txt = models.TextField(blank=True)

    @property
    def url(self):
        dir = settings.MEDIA_URL
        file = str(self.media_file)
        url = os.path.join(dir, file)
        return url


class DbVideo(DbMedia):
    name = models.CharField(max_length=50, null=True, blank=True, unique=True)
    media_file = models.FileField(upload_to='uploaded_videos')
    caption = models.TextField(blank=True)
    alt_txt = models.TextField(blank=True)

    @property
    def url(self):
        dir = settings.MEDIA_URL
        file = str(self.media_file)
        url = os.path.join(dir, file)
        return url


class MediaContainer(models.Model):
    name = models.CharField(max_length=100, unique=True,
                            default=None, blank=True)
    videos = models.ManyToManyField(DbVideo, blank=True)
    images = models.ManyToManyField(DbImage, blank=True)

    def __str__(self):
        return safe_name(self.name)


class Project(models.Model):
    name = models.CharField(max_length=200)
    shannons_role = models.ManyToManyField(Role)
    location = models.ForeignKey(ProjectLocation, null=True, blank=True,
                                 on_delete=models.SET_NULL)
    show = models.ForeignKey(
        Show, null=True, blank=True, on_delete=models.SET_NULL)
    dates = models.ForeignKey(ProjectDates, null=True, blank=True,
                              on_delete=models.SET_NULL)
    collaborators = models.ManyToManyField(Collaborator, blank=True)
    awards = models.ManyToManyField(Award, blank=True)
    note = models.TextField(null=True, blank=True)
    quotes = models.ManyToManyField(Quote, blank=True)
    media = models.ForeignKey(MediaContainer, null=True, blank=True)

    class Meta:
        unique_together = ['name', 'dates']

    def __str__(self):
        return safe_name(self.name)


class NavigationEntry(models.Model):
    name = models.CharField(max_length=100, unique=True)
    link = models.CharField(max_length=100, null=True, blank=True)

    def __str__(self):
        return safe_name(self.name)


class Menu(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True, unique=True)
    links = models.ManyToManyField(NavigationEntry, blank=True)

    def __str__(self):
        return safe_name(self.name)


class Section(models.Model):
    name = models.CharField(max_length=100, unique=True)
    header = models.TextField(null=True, blank=True)
    body = models.TextField(null=True, blank=True)

    def __str__(self):
        return safe_name(self.name)


class ProjectSection(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True)
    roles = models.ManyToManyField(Role, blank=True)
    media = models.ForeignKey(MediaContainer, null=True, blank=True)

    def __str__(self):
        return safe_name(self.name)

    @property
    def images(self):
        return self.media.images

    @property
    def videos(self):
        return self.media.videos


class Page(models.Model):
    name = models.CharField(max_length=100)
    title = models.TextField(null=True, blank=True)
    slug = models.TextField(null=True, blank=True)
    big_image = models.ForeignKey(DbImage, null=True, blank=True)
    internal_menu = models.ForeignKey(Menu, null=True, blank=True)
    about = models.ForeignKey(Section, null=True, blank=True)
    project_section = models.ForeignKey(ProjectSection, null=True, blank=True)
    roles_in_resume = models.ManyToManyField(Role, blank=True)

    def __str__(self):
        return safe_name(self.name)


def safe_name(string):
    default_string = 'I am sad because I have no name.'
    output = string if string is not None else default_string
    return output
