import uuid
from django.contrib.auth.models import User
from django.db import models
from django.core.validators import FileExtensionValidator
import os
from django.conf import settings
from django.utils.translation import gettext_lazy as _

from .fields import WEBPField

def get_file_path(_instance, filename):
    ext = filename.split('.')[-1]
    filename = f'{uuid.uuid4()}.{ext}'
    return filename


class Base(models.Model):
    criado = models.DateField('Criação', auto_now_add=True)
    modificado = models.DateField('Modificado', auto_now=True)
    ativo = models.BooleanField('Ativo ?', default=True)

    class Meta:
        abstract = True


def empresa_folder(instance, filename):
    return 'empresa/{}.webp'.format(uuid.uuid4().hex)


class Empresa(Base):
    nome = models.CharField('Nome', unique=True, max_length=40)
    titulo = models.CharField('Titulo', max_length=40)
    descricao = models.TextField('Descrição', max_length=500, blank=True)
    historia = models.TextField('História', max_length=500, blank=True)
    extra = models.TextField('Texto Extra', max_length=500, blank=True)
    data_empresa = models.DateField('Data Abertura')
    moeda = models.CharField('Moeda', default='€', max_length=3, blank=True)
    background_site = models.CharField('Cor Background Site', default='', max_length=6, blank=True)
    background_pagina_principal = models.CharField('Background Página Principal', default='', max_length=6, blank=True)
    gastronomia = models.CharField('Menu_gastronomia', default='', max_length=20, blank=True)
    gastronomia_titulo = models.CharField('Titulo gastronomia', default='', max_length=30, blank=True)
    produtos = models.CharField('Menu_Produtos', default='Menu', max_length=20, blank=True)
    produtos_titulo = models.CharField('Titulo Produtos', default='Menu', max_length=30, blank=True)
    offers = models.CharField('Menu_Offers', default='Pratos do Dia', max_length=20, blank=True)
    offers_titulo = models.CharField('Titulo Offers', default='Pratos do Dia', max_length=30, blank=True)
    sobre = models.CharField('Menu_Sobre', default='Sobre', max_length=20, blank=True)
    sobre_titulo = models.CharField('Titulo Sobre', default='Gabriella Small', max_length=30, blank=True)
    galeria = models.CharField('Menu_Galeria', default='Galeria', max_length=20, blank=True)
    galeria_titulo = models.CharField('Titulo Galeria', default='Galeria', max_length=30, blank=True)
    contato = models.CharField('Menu_Contato', default='Contato', max_length=20, blank=True)
    contato_titulo = models.CharField('Titulo Contato', default='Contato', max_length=30, blank=True)
    blog = models.CharField('Menu_Blog', default='Blog', max_length=20, blank=True)
    blog_titulo = models.CharField('Titulo Blog', default='Blog', max_length=30, blank=True)
    passeio = models.CharField('Menu_Passeio', default='Viagens', max_length=20, blank=True)
    passeio_titulo = models.CharField('Titulo Passeio', default='Blog de Viagens', max_length=30, blank=True)
    reserva = models.CharField('Menu_Reserva', default='Reservas', max_length=20, blank=True)
    reserva_titulo = models.CharField('Titulo Reserva', default='Reserva', max_length=30, blank=True)
    botao_produto = models.CharField('Título Botão Produtos', default='Comprar', max_length=15)
    botao_contato = models.CharField('Título Botão Contato', default='Enviar', max_length=15)
    valor_produtos = models.BooleanField('Produto tem Valor ?', default=True)
    height = models.IntegerField(verbose_name=_('Height'), default=900)
    width = models.IntegerField(verbose_name=_('Width'), default=900)
    imagem_principal = WEBPField(
        verbose_name=_('Página Principal'),
        upload_to=empresa_folder,
        height_field='height',
        width_field='width',
        default=''
    )
    imagem_empresa = WEBPField(
        verbose_name=_('Página empresa'),
        upload_to=empresa_folder,
        height_field='height',
        width_field='width',
        default=''
    )
    imagem_reserva = WEBPField(
        verbose_name=_('Página reserva'),
        upload_to=empresa_folder,
        height_field='height',
        width_field='width',
        default=''
    )

    class Meta:
        verbose_name = 'Empresa'
        verbose_name_plural = 'Empresas'


def principal_folder(instance, filename):
    return 'principal/{}.webp'.format(uuid.uuid4().hex)


class PaginaPrincipal(Base):
    titulo = models.CharField('Título Página Principal', max_length=30, blank=True, null=True)
    descricao = models.CharField('Descrição', max_length=160, blank=True, null=True)
    rodape = models.CharField('Rodapé', max_length=30, blank=True, null=True)
    href = models.CharField('Redireciona #', max_length=20, blank=True, null=True)
    historia = models.BooleanField('Historia ? ', default=False)
    passeios = models.BooleanField('Passeios ? ', default=False)
    blog = models.BooleanField('Blog / News ? ', default=False)
    galeria = models.BooleanField('Galeria de Fotos ? ', default=False)
    menu = models.BooleanField('Comidas ? ', default=False)
    gastronomia = models.BooleanField('Gastronomia ? ', default=False)
    informacoes = models.BooleanField('Informações ? ', default=False)
    serviços = models.BooleanField('Serviços ? ', default=False)
    height = models.IntegerField(verbose_name=_('Height'), default=900)
    width = models.IntegerField(verbose_name=_('Width'), default=900)
    imagem = WEBPField(
        verbose_name=_('Image'),
        upload_to=principal_folder,
        height_field='height',
        width_field='width',
        default = '',
        null = True,
        blank = True
    )
    imagem2 = WEBPField(
        verbose_name=_('Image'),
        upload_to=principal_folder,
        height_field='height',
        width_field='width',
        default='',
        null=True,
        blank=True
    )

    class Meta:
        verbose_name = 'Página Principal'
        verbose_name_plural = 'Página Principal'

    def __str__(self):
        return self.titulo


class FotoPaginaPrincipal(Base):
    titulo = models.CharField('Título Página Principal', max_length=40, blank=True, null=True)
    alto = models.BooleanField('Título Superior ? ', default=False)
    centro = models.BooleanField('Título Centro ? ', default=False)
    baixo = models.BooleanField('Título Inferior ? ', default=False)
    height = models.IntegerField(verbose_name=_('Height'), default=900)
    width = models.IntegerField(verbose_name=_('Width'), default=900)
    image = WEBPField(
        verbose_name=_('Image'),
        upload_to=principal_folder,
        height_field='height',
        width_field='width'
    )
    image_celular = WEBPField(
        verbose_name=_('Image'),
        upload_to=principal_folder,
        height_field='height',
        width_field='width',
        default='',
        null=True,
        blank=True
    )

    class Meta:
        verbose_name = 'Foto_Principal'
        verbose_name_plural = 'Fotos_Principal'

    def __str__(self):
        return self.titulo


def sobre_folder(instance, filename):
    return 'sobre/{}.webp'.format(uuid.uuid4().hex)


class FotoPaginaSobre(Base):
    titulo = models.CharField('Título para essa foto', max_length=40, blank=True, null=True)
    alto = models.BooleanField('Título Superior ? ', default=False)
    centro = models.BooleanField('Título Centro ? ', default=False)
    baixo = models.BooleanField('Título Inferior ? ', default=False)
    descricao = models.TextField('Descrição', max_length=500, blank=True)
    historia = models.TextField('História', max_length=500, blank=True)
    height = models.IntegerField(verbose_name=_('Height'), default=600)
    width = models.IntegerField(verbose_name=_('Width'), default=600)
    image = WEBPField(
        verbose_name=_('Imagem'),
        upload_to=principal_folder,
        height_field='height',
        width_field='width'
    )

    class Meta:
        verbose_name = 'Foto_Sobre'
        verbose_name_plural = 'Fotos_Sobre'

    def __str__(self):
        return self.titulo


def categoria_gastro_folder(instance, filename):
    return 'categoria_gastro/{}.webp'.format(uuid.uuid4().hex)


class CategoriaGastro(Base):
    categoria_gastro = models.CharField('Categoria Gastro', unique=False, default='Cafe', max_length=20)
    descricao = models.TextField('Descrição', max_length=300)
    height = models.IntegerField(verbose_name=_('Height'), default=900)
    width = models.IntegerField(verbose_name=_('Width'), default=900)
    imagem = WEBPField(
        verbose_name=_('Imagem'),
        upload_to=categoria_gastro_folder,
        height_field='height',
        width_field='width',
        default=''
    )

    class Meta:
        verbose_name = 'Categoria Gastro'
        verbose_name_plural = 'Categorias Gastro'

    def __str__(self):
        return self.categoria_gastro


def gastro_folder(instance, filename):
    return 'gastronomia/{}.webp'.format(uuid.uuid4().hex)


class ClienteGastro(Base):
    nome = models.CharField('Nome', unique=True, max_length=40)
    categoria_gastro = models.ForeignKey(CategoriaGastro, on_delete=models.SET_NULL, null=True)
    frase = models.CharField('Frase', max_length=100)
    localizacao = models.CharField('Localização', max_length=100)
    endereco = models.CharField('Endereço', max_length=100)
    freguesia = models.CharField('Freguesia', default='Centro', max_length=40, blank=True)
    concelho = models.CharField('Concelho', default='Viana do Castelo', max_length=40, blank=True)
    email = models.EmailField('E-mail', max_length=60)
    telefone = models.CharField('Telefone', max_length=20, null=True)
    descricao = models.TextField('Descrição', max_length=300, blank=True)
    historia = models.TextField('História', max_length=300, blank=True)
    plano_basico = models.BooleanField('Somente Plano Básico ? ', default=True)
    tem_small_place = models.BooleanField('Tem Site Small-Place ? ', default=False)
    fotos_local = models.IntegerField('Nº Fotos Plano', default=0, null=True)
    maximo_produtos = models.IntegerField('Máximo de Produtos', default=0, null=True)
    tem_menu = models.BooleanField('Plano com Menu ? ', default=False)
    tem_reservas = models.BooleanField('Tem Reservas ? ', default=False)
    redes_sociais = models.BooleanField('Plano Link Redes Sociais ? ', default=False)
    instagram = models.CharField('Instagram', default='', max_length=40, null=True)
    facebook = models.CharField('Facebook', default='', max_length=40, null=True)
    twitter = models.CharField('Twitter', default='', max_length=40, null=True)
    whatsapp = models.CharField('whatsapp', default='', max_length=40, null=True)
    valor_implantacao = models.DecimalField('Preço Implantacao', max_digits=10, decimal_places=2, null=True)
    valor_mensal = models.DecimalField('Preço Mensal Plano', max_digits=10, decimal_places=2, null=True)
    imagem_redonda_completo = models.BooleanField('Imagem redonda menu completo ? ', default=False)
    imagem_redonda_prato = models.BooleanField('Imagem redonda prato ? ', default=False)
    height = models.IntegerField(verbose_name=_('Height'), default=900)
    width = models.IntegerField(verbose_name=_('Width'), default=900)
    imagem = WEBPField(
        verbose_name=_('Imagem'),
        upload_to=gastro_folder,
        height_field='height',
        width_field='width',
        default=''
    )

    class Meta:
        verbose_name = 'Cliente Gastronomia'
        verbose_name_plural = 'Clientes Gastronomia'

    def __str__(self):
        return self.nome

def gastro_detail_folder(instance, filename):
    return 'gastro_detail/{}.webp'.format(uuid.uuid4().hex)


def gastro_pratos_folder(instance, filename):
    return 'gastro_pratos/{}.webp'.format(uuid.uuid4().hex)


class GastroDetail(Base):
    restaurante = models.ForeignKey(ClienteGastro,on_delete=models.CASCADE,related_name='gastro_detalhes')
    height = models.IntegerField(verbose_name=_('Height'), default=500)
    width = models.IntegerField(verbose_name=_('Width'), default=500)
    titulo_restaurante = models.CharField('Título para essa foto', max_length=40, blank=True, null=True)
    descricao_restaurante = models.TextField('Descrição', max_length=400, blank=True)
    text_white_restaurante = models.BooleanField('Texto Branco ?', default=False)
    imagem_redonda_restaurante = models.BooleanField('Foto Redonda ?', default=False)
    card_livre_restaurante = models.BooleanField('Card Livre ?', default=False)
    card_fundo_restaurante = models.BooleanField('Card Detail ?', default=False)
    imagem_restaurante = WEBPField(
        verbose_name=_('Imagem Restaurante'),
        upload_to=gastro_detail_folder,
        height_field='height',
        width_field='width',
        blank=True,
        default=''
    )
    titulo_card = models.CharField('Título do cartão', max_length=20, blank=True, null=True)
    titulo_prato = models.CharField('Título para essa foto', max_length=40, blank=True, null=True)
    descricao_prato = models.TextField('Descrição Prato', max_length=200, blank=True)
    preco = models.DecimalField('Preço', default=0.0, null=True, max_digits=10, decimal_places=2, )
    text_white_prato = models.BooleanField('Texto Branco ?', default=False)
    imagem_redonda_prato = models.BooleanField('Foto Redonda ?', default=True)
    card_livre_prato = models.BooleanField('Card Livre Prato ?', default=False)
    card_fundo_prato = models.BooleanField('Card Fundo Prato ?', default=False)
    imagem_prato = WEBPField(
        verbose_name=_('Imagem'),
        upload_to=gastro_pratos_folder,
        height_field='height',
        width_field='width',
        blank=True,
        default=''
    )

    class Meta:
        verbose_name = 'Gastro Detalhe'
        verbose_name_plural = 'Gastro Detalhes'

    def __str__(self):
        return self.restaurante.nome


class Categoria(Base):
    categoria = models.CharField('Categoria', unique=True, max_length=20)
    menu_categoria = models.CharField('pills-categoria', default='pills-cat', max_length=25)
    href_categoria = models.CharField('Href #pills-categoria', default='#pills-cat', max_length=25)
    tab_categoria = models.CharField('pills-categoria-tab', default='pills-cat-tab', max_length=25)
    descricao = models.TextField('Descrição', max_length=300)
    imagem = models.ImageField('Imagem', upload_to='categoria', blank=True, default='')

    class Meta:
        verbose_name = 'Categoria'
        verbose_name_plural = 'Categorias'

    def __str__(self):
        return self.categoria


def produtos_folder(instance, filename):
    return 'produtos/{}.webp'.format(uuid.uuid4().hex)


class Produto(Base):
    restaurante = models.ForeignKey(ClienteGastro,on_delete=models.CASCADE,related_name='gastro_prato', null=True)
    nome = models.CharField('Nome', unique=True, max_length=40)
    categoria = models.ForeignKey(Categoria, on_delete=models.PROTECT)
    descricao = models.TextField('Descrição', max_length=300)
    promocao = models.BooleanField('Promoção ? ', default=False)
    preco = models.DecimalField('Preço', max_digits=10, decimal_places=2)
    preco_promocao = models.DecimalField('Preço Especial', default=0.0, max_digits=10, decimal_places=2)
    height = models.IntegerField(verbose_name=_('Height'), default=600)
    width = models.IntegerField(verbose_name=_('Width'), default=600)
    imagem = WEBPField(
        verbose_name=_('Imagem'),
        upload_to=produtos_folder,
        height_field='height',
        width_field='width',
        default=''
    )

    class Meta:
        verbose_name = 'Produto'
        verbose_name_plural = 'Produtos'

    def __str__(self):
        return self.nome


def referencia_foto_folder(instance, filename):
    return 'referencia_foto/{}.webp'.format(uuid.uuid4().hex)


class ReferenciaFoto(models.Model):
    referencia = models.CharField('Tipo da Foto', max_length=40)
    descricao = models.TextField('Descrição', max_length=300)
    height = models.IntegerField(verbose_name=_('Height'), default=900)
    width = models.IntegerField(verbose_name=_('Width'), default=900)
    imagem = WEBPField(
        verbose_name=_('Imagem'),
        upload_to=referencia_foto_folder,
        height_field='height',
        width_field='width',
        default=''
    )

    class Meta:
        verbose_name = 'Tipo Foto'
        verbose_name_plural = 'Tipo Fotos'

    def __str__(self):
        return self.referencia


def galeria_folder(instance, filename):
    return 'galeria/{}.webp'.format(uuid.uuid4().hex)


class Galeria(Base):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    autor = models.CharField('Fotografado por:', default='Marcio Small', max_length=25)
    titulo = models.CharField('Título da Foto', max_length=40)
    referencia = models.ForeignKey(ReferenciaFoto, on_delete=models.SET_NULL, null=True)
    descricao = models.TextField('Descrição', blank=True, max_length=300)
    video = models.FileField('Vídeo', upload_to='galeria', blank=True, null=True, validators=[FileExtensionValidator(allowed_extensions=['MOV', 'avi', 'mp4', 'webm', 'mkv'])])
    height = models.IntegerField(verbose_name=_('Height'), default=600)
    width = models.IntegerField(verbose_name=_('Width'), default=600)
    imagem = WEBPField(
        verbose_name=_('Imagem'),
        upload_to=galeria_folder,
        height_field='height',
        width_field='width',
        default=''
    )

    class Meta:
        verbose_name = 'Foto'
        verbose_name_plural = 'Fotos'

    def __str__(self):
        return self.titulo


class Reserva(Base):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, default=None, null=True)
    nome = models.CharField('Nome', max_length=40)
    email = models.EmailField('E-mail', max_length=60)
    telefone = models.CharField('Telefone', max_length=20, null=True)
    data = models.DateField('Data Reserva')
    hora = models.TimeField('Horário')
    pessoas = models.PositiveIntegerField('Quantas Pessoas ?')
    mensagem = models.TextField('Mensagem', max_length=100)
    confirmacao = models.BooleanField('Confirmado', default=False)

    class Meta:
        verbose_name = 'Reserva'
        verbose_name_plural = 'Reservas'

    def __str__(self):
        return self.nome


class Contato(Base):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, default=None, null=True)
    nome = models.CharField('Nome', max_length=40)
    email = models.EmailField('E-mail', max_length=60)
    assunto = models.CharField('Assunto', max_length=60)
    foto = models.ImageField('Imagem', upload_to='contato', blank=True, default='')
    pode_publicar = models.BooleanField('Pode Publicar ?', default=False)
    mensagem = models.TextField('Mensagem', max_length=600)

    class Meta:
        verbose_name = 'Contato'
        verbose_name_plural = 'Contatos'

    def __str__(self):
        return self.nome


STATUS = (
    (0,"Draft"),
    (1,"Publish")
)

def blog_folder(instance, filename):
    return 'blog/{}.webp'.format(uuid.uuid4().hex)


class Post(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE,related_name='blog_posts')
    updated_on = models.DateTimeField(auto_now=True)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)
    height = models.IntegerField(verbose_name=_('Height'), default=600)
    width = models.IntegerField(verbose_name=_('Width'), default=600)
    foto = WEBPField(
        verbose_name=_('Foto'),
        upload_to=blog_folder,
        height_field='height',
        width_field='width',
        default=''
    )
    video = models.FileField('Vídeo', upload_to='posts', blank=True, null=True, default='', validators=[FileExtensionValidator(allowed_extensions=['MOV', 'avi', 'mp4', 'webm', 'mkv'])])

    class Meta:
        ordering = ['-created_on']
        verbose_name = 'Post'
        verbose_name_plural = 'Posts'

    def __str__(self):
        return self.title


class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name='comments')
    name = models.CharField('Nome', max_length=80)
    email = models.EmailField('E-mail')
    body = models.TextField('Comentário')
    created_on = models.DateTimeField('Data e Hora', auto_now_add=True)
    active = models.BooleanField('Ativo', default=False)

    class Meta:
        ordering = ['created_on']
        verbose_name = 'Comentário'
        verbose_name_plural = 'Comentários'

    def __str__(self):
        return 'Comment {} by {}'.format(self.body, self.name)
    

class Atracao(models.Model):
     atracao = models.CharField('Tipo de Local', primary_key=True, max_length=25)
     descricao = models.CharField('Descrição', max_length=25)


def passeios_folder(instance, filename):
    return 'passeios/{}.webp'.format(uuid.uuid4().hex)


class Passeio(models.Model):
    title = models.CharField(max_length=200, unique=True)
    slug = models.SlugField(max_length=200, unique=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE,related_name='passeio_posts')
    updated_on = models.DateTimeField(auto_now=True)
    content = models.TextField()
    created_on = models.DateTimeField(auto_now_add=True)
    status = models.IntegerField(choices=STATUS, default=0)
    height = models.IntegerField(verbose_name=_('Height'), default=600)
    width = models.IntegerField(verbose_name=_('Width'), default=600)
    foto = WEBPField(
        verbose_name=_('Foto'),
        upload_to=passeios_folder,
        height_field='height',
        width_field='width',
        default=''
    )
    video = models.FileField('Vídeo', upload_to='videos', blank=True, null=True, validators=[FileExtensionValidator(allowed_extensions=['MOV', 'avi', 'mp4', 'webm', 'mkv'])])
    pais = models.CharField('Nome do País', max_length=40)
    cidade = models.CharField('Concelho / Cidade', max_length=40)
    localizacao = models.CharField('Localização', max_length=100)
    pode_publicar = models.BooleanField('Pode Publicar ?', default=True)
    atracao = models.ForeignKey(Atracao, null=True, on_delete=models.SET_NULL)

    class Meta:
        ordering = ['atracao']
        verbose_name = 'Passeio'
        verbose_name_plural = 'Passeios'

    def __str__(self):
        return self.title


def passeio_folder(instance, filename):
    return 'passeio/{}.webp'.format(uuid.uuid4().hex)


class PasseioFoto(models.Model):
    passeio = models.ForeignKey(Passeio,on_delete=models.CASCADE,related_name='passeio_fotos')
    titulo = models.CharField('Título para essa foto', max_length=40, default='', blank=True)
    texto = models.TextField('Descrição', max_length=500, blank=True)
    created_on = models.DateTimeField('Data e Hora', auto_now_add=True)
    active = models.BooleanField('Ativo', default=True)
    height = models.IntegerField(verbose_name=_('Height'), default=600)
    width = models.IntegerField(verbose_name=_('Width'), default=600)
    imagem = WEBPField(
        verbose_name=_('Image'),
        upload_to=passeio_folder,
        height_field='height',
        width_field='width'
    )

    class Meta:
        ordering = ['created_on']
        verbose_name = 'Foto_Passeio'
        verbose_name_plural = 'Fotos_Passeio'

    def __str__(self):
        return 'PasseioFoto {} by {}'.format(self.texto, self.titulo)


class PasseioComment(models.Model):
    passeio = models.ForeignKey(Passeio,on_delete=models.CASCADE,related_name='passeio_comments')
    name = models.CharField('Nome', max_length=80)
    email = models.EmailField('E-mail')
    body = models.TextField('Comentário')
    created_on = models.DateTimeField('Data e Hora', auto_now_add=True)
    active = models.BooleanField('Ativo', default=False)

    class Meta:
        ordering = ['created_on']
        verbose_name = 'Comentário Passeio'
        verbose_name_plural = 'Comentários Passeio'

    def __str__(self):
        return 'PasseioComment {} by {}'.format(self.body, self.name)
    

