from django.db import models
from django.utils.safestring import mark_safe
import base64
import os

# Create your models here.


class Keywords(models.Model):
    keyword = models.CharField(max_length=32)

    def __str__(self):
        return self.keyword


class Tikz(models.Model):
    folder = models.CharField(max_length=255)
    filename = models.CharField(max_length=64)
    modified = models.DateTimeField()
    line = models.IntegerField()
    source = models.TextField()
    thumbnail = models.BinaryField()  # will be stored PNG
    description = models.CharField(max_length=255, blank=True)
    hide = models.BooleanField(default=False)
    keywords = models.ManyToManyField(Keywords, blank=True)
    domain = models.CharField(max_length=32, blank=True)

    def __str__(self):
        return f"{self.path}, line {self.line}"

    def html(self, **kwargs):
        properties = []
        if 'width' in kwargs:
            w = kwargs['width']
            if isinstance(w, float):
                properties.append(f'width="{100*w}%"')
            elif isinstance(w, int):
                properties.append(f'width="{w}px"')

        bits = base64.encodebytes(self.thumbnail)
        s = f'<img src="data:image/png;base64,{bits.decode()}"'
        if properties:
            t = "".join(properties)
            s += ' ' + t
        return mark_safe(s + '>')

    @property
    def path(self):
        return os.path.join(self.folder, self.filename)

    @property
    def csr(self):
        """
        Return the folder name of the base course folder. For example: p117
        """
        return self.domain

    @property
    def course(self):
        csr = self.csr
        if csr.startswith('p'):
            return "Physics " + csr[1:]
        return csr

    class Meta:
        ordering = [
            'folder',
        ]
