from django.contrib.postgres.fields import ArrayField
from django.db import models
from martor.models import MartorField

from territories_dashboard_lib.commons.models import CommonModel
from territories_dashboard_lib.indicators_lib.enums import STANDARD_MESHES, MeshLevel
from territories_dashboard_lib.website_lib.navigation import (
    parse_footer_navigation,
    parse_header_navigation,
    parse_markdown_link,
)
from territories_dashboard_lib.website_lib.static_content import (
    markdown_content_to_html,
)


def get_default_meshes():
    return STANDARD_MESHES


class MainConf(CommonModel):
    title = models.TextField(
        verbose_name="Titre principal du site", default="Tableau de bord"
    )
    description = models.TextField(
        verbose_name="Description du site",
        null=True,
        blank=True,
        help_text="Utilisé pour la balise meta description du site et pour le relais sur les réseaux sociaux.",
    )
    entity = models.TextField(
        verbose_name="Entité qui possède le site",
        default="",
        help_text="Renseigner le nom de l'entité au même format que le logo officiel en respectant les mises à la ligne.",
    )
    header_navigation = models.TextField(
        verbose_name="Navigation du header",
        help_text="""Navigation du header (liste des onglets et sous-onglets en haut de page).
Mettre les liens au format markdown avec un slash à la fin du lien, mettre une ligne vide entre chaque rubrique.
        
Une rubrique peut contenir un seul lien, ou bien plusieurs, dans ce cas la rubrique sera sous forme de dropdown et il faut mettre un titre en premier. 

Par exemple : 

[Accueil](/accueil/)

[Indicateurs territoriaux](/indicateurs/)

À propos
[Présentation](/presentation/)
[Journal des versions](/journal/)""",
        default="",
    )
    footer_navigation = models.TextField(
        verbose_name="Navigation du footer",
        help_text="""Navigation du footer (bas de page).
Mettre les liens au format markdown, un par ligne.

Si le lien est interne, commencer et terminer le lien par un slash comme "/accueil/"

Par exemple :

[Plan du site](/plan-site/)
[Accessibilité](/accessibilite/)
[Mentions légales](/mentions-legales/)""",
        default="",
    )
    contact_email = models.TextField(
        default=None,
        null=True,
        blank=True,
        verbose_name="Email de contact",
        help_text="Uniquement si l'affichage de la bannière d'email de contact et d'inscription à la newsletter est activée.",
    )
    newsletter_link = models.TextField(
        default=None,
        null=True,
        blank=True,
        verbose_name="Lien d'inscription à la newsletter",
        help_text="Uniquement si l'affichage de la bannière d'email de contact et d'inscription à la newsletter est activée.",
    )
    show_footer_contact_banner = models.BooleanField(
        default=False,
        verbose_name="Afficher une bannière de contact au-dessus du footer",
        help_text="Pour afficher la bannière, l'email de contact et le lien d'inscription à la newsletter doivent être renseignés.",
    )
    social_image_url = models.TextField(
        null=True,
        blank=True,
        verbose_name="Image de description",
        help_text="Lien d'une image (idéalement 1200x630px). Elle sera utilisée lors du partage sur les réseaux sociaux.",
    )
    meshes = ArrayField(
        models.TextField(choices=MeshLevel),
        default=get_default_meshes,
        verbose_name="Mailles",
        help_text=f"Liste des mailles territoriales activées sur la plateforme, la liste des mailles disponible est : {[m.value for m in MeshLevel]}.<br/>L'ajout de nouvelles mailles demande une modification de la base de données des indicateurs ainsi que du code.",
    )

    @property
    def entity_breaklines(self):
        return self.entity.replace("\n", "<br/>")

    @property
    def parsed_header_navigation(self):
        return parse_header_navigation(self.header_navigation)

    @property
    def parsed_footer_navigation(self):
        return parse_footer_navigation(self.footer_navigation)

    def __str__(self):
        return "Configuration principale"

    class Meta:
        verbose_name = "Configuration principale"
        verbose_name_plural = "Configurations principales"


class LandingPage(CommonModel):
    title = models.TextField(verbose_name="Titre")
    body = MartorField(
        verbose_name="Contenu",
        help_text="Contenu de la page d'accueil au format Markdown pour la page d'accueil par défaut.",
    )
    button_link = models.TextField(
        verbose_name="Lien du bouton",
        help_text="""Lien du bouton d'action de la page d'accueil (pour la page d'accueil par défaut), au format markdown, par exemple : [découvrir les indicateurs](/indicateurs/)""",
    )

    @property
    def body_html(self):
        return markdown_content_to_html(self.body)

    @property
    def button(self):
        return parse_markdown_link(self.button_link)

    class Meta:
        verbose_name = "Page d'accueil"
        verbose_name_plural = "Page d'accueil"

    def __str__(self):
        return "Page d'accueil"


class StaticPage(CommonModel):
    name = models.TextField(verbose_name="Nom de la page")
    url = models.TextField(
        verbose_name="Url de la page",
        help_text="En minuscule avec des espaces remplacés par des traits '-'.<br/>Par exemple : <br/><br/> indicateurs <br/> mentions-legales",
    )
    body = MartorField(verbose_name="Contenu")

    @property
    def body_html(self):
        return markdown_content_to_html(self.body)

    class Meta:
        verbose_name = "Page Statique"
        verbose_name_plural = "Pages Statiques"

    def __str__(self):
        return self.name


class GlossaryItem(CommonModel):
    word = models.TextField(verbose_name="Mot")
    definition = models.TextField(verbose_name="Définition")

    class Meta:
        verbose_name = "Définition"
        verbose_name_plural = "Page Lexique"
        ordering = ["word"]

    def __str__(self):
        return self.word


class NoticeBanner(CommonModel):
    title = models.CharField(
        max_length=64,
        verbose_name="Titre",
        help_text="Sera affiché en gras au début de la bannière.",
    )
    description = models.CharField(
        max_length=255,
        verbose_name="Description",
        help_text="Texte à afficher dans la bannière à la suite du Titre.",
    )
    link_href = models.CharField(
        null=True,
        blank=True,
        max_length=255,
        verbose_name="Lien",
        help_text="Optionnel. Le lien doit être un lien interne et commencer et terminer par '/', par exemple '/journal/'",
    )
    link_text = models.CharField(
        null=True,
        blank=True,
        max_length=64,
        verbose_name="Intitulé du lien",
        help_text="Optionnel. A remplir seulement si un lien est spécifié",
    )

    class Meta:
        ordering = ["-created_at"]
