
import datetime
import os

from django.contrib.auth.models import User
from django.db import models
from django.conf import settings
from django.utils.encoding import python_2_unicode_compatible
from django.http import HttpResponse
from django.template.loader import get_template
from weasyprint import HTML, CSS

from riskmap import RiskMap
from healthbackend import utils

###################################################################
#
# Modelos para los ejercicios
#
###################################################################


class BloqueEjercicios(models.Model):
    nombre = models.CharField(max_length=250, verbose_name='Nombre')
    descripcion = models.TextField(null=True, blank=True)

    def __str__(self):
        return self.nombre

    class Meta:
        verbose_name_plural = "Bloques de ejercicios"


class NivelBloque(models.Model):
    bloque_ejercicios = models.ForeignKey(BloqueEjercicios, on_delete=models.CASCADE)
    nivel = models.IntegerField()
    descripcion = models.TextField(null=True, blank=True)

    def __str__(self):
        return "{}:{}".format(self.bloque_ejercicios, self.nivel)

    class Meta:
        ordering = ["bloque_ejercicios", "nivel"]


class TareaEjercicio(models.Model):
    nivel_ejercicios = models.ForeignKey(NivelBloque, on_delete=models.CASCADE)
    orden = models.PositiveSmallIntegerField(default=1)
    nombre = models.CharField(max_length=250, verbose_name='Nombre')
    descripcion = models.TextField(null=True, blank=True)

    def __str__(self):
        return "{} - {}:{}".format(self.nivel_ejercicios, self.orden, self.nombre)

    class Meta:
        ordering = ["nivel_ejercicios__bloque_ejercicios", "nivel_ejercicios__nivel", "orden"]


class FotoTarea(models.Model):
    tarea_ejercicio = models.ForeignKey(TareaEjercicio, on_delete=models.CASCADE)
    foto = models.ImageField(upload_to="tareas/")


class BloqueEjerciciosPaciente(models.Model):
    """
    Recomendacion dada al paciente segun su cuestionario
    """
    #paciente = models.ForeignKey("Patient", on_delete=models.CASCADE)
    cuestionario = models.OneToOneField("Cuestionario", on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)

    bloque_ejercicios = models.ForeignKey(BloqueEjercicios, on_delete=models.CASCADE)

    def to_pdf(self, as_httpresponse=True, base_url=None):

        paciente = self.cuestionario.paciente
        data = {
            "modelo": "vitahealth",
            "bloque": self.bloque_ejercicios,
            "data": self,
            "paciente": paciente
        }
        report_css = os.path.join(settings.BASE_DIR, "static", "pdf", data["modelo"], "pdf.css")

        template = get_template("healthbackend/pdf/{}/ejercicios.html".format(data["modelo"]))
        html = template.render(data)

        documents = []
        documents.append( HTML(string=html, base_url=base_url).render(stylesheets=[CSS(report_css)]) )

        all_pages = []
        for doc in documents:
            for p in doc.pages:
                all_pages.append(p)

        pdf_final = documents[0].copy(all_pages).write_pdf()

        if as_httpresponse:
            http_response = HttpResponse(pdf_final, content_type='application/pdf')
            if paciente:
                filename = "Ejercicios de " + paciente.first_name + " " + paciente.last_name + ".pdf"
            else:
                filename = "Ejercicios.pdf"
            filename = filename.replace(" ", "_")
            http_response['Content-Disposition'] = 'filename="' + filename + '"'
            return http_response
        else:
            return pdf_final
