import os
from django.db import models, connection
from django.conf import settings
from .etapas import ETAPAS_PADRAO
from .uploads import user_file_path

# ========================
# Funções de caminho com SCHEMA
# ========================

def caminho_orcamento(instance, filename):
    schema = connection.schema_name
    return os.path.join(
        'etapas',
        schema,
        f'obra_{instance.obra.id}',
        f'etapa_{instance.id or "novo"}',
        'orcamentos',
        filename
    )

def caminho_contrato(instance, filename):
    schema = connection.schema_name
    return os.path.join(
        'etapas',
        schema,
        f'obra_{instance.obra.id}',
        f'etapa_{instance.id or "novo"}',
        'contratos',
        filename
    )

def caminho_foto_obra(instance, filename):
    schema = connection.schema_name
    return os.path.join(
        'etapas',
        schema,
        f'obra_{instance.obra.id}',
        f'etapa_{instance.etapa.id}' if instance.etapa else 'sem_etapa',
        'fotos',
        filename
    )

def caminho_documento_etapa(instance, filename):
    schema = connection.schema_name
    return os.path.join(
        'etapas',
        schema,
        f'obra_{instance.etapa.obra.id}',
        f'etapa_{instance.etapa.id}',
        'documentos',
        filename
    )

# ========================
# MODELOS
# ========================

class EtapaPadrao(models.Model):
    GRUPO_CHOICES = [
        ('construcao', 'Construção'),
        ('reforma', 'Reforma'),
    ]
    nome = models.CharField(max_length=100)
    grupo = models.CharField(max_length=20, choices=GRUPO_CHOICES)
    ordem = models.PositiveIntegerField(default=0)

    class Meta:
        ordering = ['grupo', 'ordem']
        verbose_name = 'Etapa Padrão'
        verbose_name_plural = 'Etapas Padrão'

    def __str__(self):
        return f"{self.get_grupo_display()} - {self.nome}"


class Obra(models.Model):
    usuario = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='obras',
        null=True,
        blank=True
    )
    nome = models.CharField(max_length=100)
    endereco = models.CharField(max_length=200)
    data_inicio = models.DateField()
    orcamento_total = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)

    def __str__(self):
        return self.nome


class EtapaObra(models.Model):
    STATUS_CHOICES = [
        ('nao_iniciada', 'Não iniciada'),
        ('em_andamento', 'Em andamento'),
        ('concluida', 'Concluída'),
        ('atrasada', 'Atrasada'),
    ]
    obra = models.ForeignKey(Obra, on_delete=models.CASCADE, related_name='etapas')
    nome = models.CharField(max_length=100)
    grupo = models.CharField(max_length=20)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='nao_iniciada')
    ordem = models.PositiveIntegerField(default=0)
    data_prevista_fim = models.DateField(null=True, blank=True)
    subgrupo = models.CharField(max_length=100, blank=True, null=True)
    descricao = models.TextField(blank=True, null=True)
    profissional = models.CharField(max_length=100, blank=True, null=True)
    documento_profissional = models.CharField(max_length=18, blank=True, null=True)
    valor_orcado = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    data_inicio = models.DateField(null=True, blank=True)
    data_fim = models.DateField(null=True, blank=True)

    documento_orcamento = models.FileField(upload_to=caminho_orcamento, null=True, blank=True)
    contrato_servico = models.FileField(upload_to=caminho_contrato, null=True, blank=True)

    class Meta:
        ordering = ['ordem']
        verbose_name = 'Etapa da Obra'
        verbose_name_plural = 'Etapas da Obra'

    def __str__(self):
        return f"{self.obra.nome} - {self.nome}"

    def esta_atrasada(self):
        from datetime import date
        return self.status == 'em_andamento' and self.data_prevista_fim and date.today() > self.data_prevista_fim

    def save(self, *args, **kwargs):
        if not self.descricao:
            padrao = ETAPAS_PADRAO.get(self.grupo, {})
            for subgrupo_nome, lista_etapas in padrao.items():
                for etapa_info in lista_etapas:
                    if etapa_info["nome"] == self.nome:
                        self.descricao = etapa_info.get("descricao", "")
                        break
                if self.descricao:
                    break
        super().save(*args, **kwargs)


class GrupoAtividade(models.Model):
    nome = models.CharField(max_length=100, unique=True)
    tipo = models.CharField(max_length=20, choices=[('material', 'Material'), ('serviço', 'Serviço')])

    def __str__(self):
        return f"{self.nome} ({self.tipo})"

from .uploads import pagamento_file_path 

class Pagamento(models.Model):
    obra = models.ForeignKey(Obra, on_delete=models.CASCADE)
    etapa = models.ForeignKey(EtapaObra, on_delete=models.SET_NULL, null=True, blank=True)
    grupo = models.ForeignKey(GrupoAtividade, on_delete=models.SET_NULL, null=True, blank=True)
    tipo = models.CharField(max_length=20, choices=[('Profissional', 'Profissional'), ('Material', 'Material')])
    descricao = models.CharField(max_length=200, default='Pagamento')
    material_outro = models.CharField(max_length=200, null=True, blank=True)
    valor = models.DecimalField(max_digits=10, decimal_places=2)
    data = models.DateField()
    comprovante = models.FileField(upload_to=pagamento_file_path, null=True, blank=True)
    quantidade = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    unidade = models.CharField(max_length=50, null=True, blank=True)
    pago = models.BooleanField(default=True)

    def __str__(self):
        return f"{self.tipo} - {self.descricao} - R$ {self.valor}"


class Foto(models.Model):
    obra = models.ForeignKey(Obra, on_delete=models.CASCADE)
    etapa = models.ForeignKey(EtapaObra, on_delete=models.CASCADE, null=True, blank=True)
    imagem = models.ImageField(upload_to=caminho_foto_obra)
    descricao = models.CharField(max_length=255, blank=True)
    data_envio = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"Foto {self.id} – {self.etapa.nome if self.etapa else 'Sem etapa'}"


class FotoObra(models.Model):
    obra = models.ForeignKey(Obra, on_delete=models.CASCADE, related_name='fotos')
    imagem = models.ImageField(upload_to=caminho_foto_obra)
    data_envio = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"Foto da Obra #{self.obra.id} enviada em {self.data_envio.strftime('%d/%m/%Y')}"


class DocumentoEtapa(models.Model):
    TIPO_CHOICES = [
        ('orcamento', 'Orçamento'),
        ('contrato', 'Contrato de Serviço'),
    ]

    etapa = models.ForeignKey(EtapaObra, on_delete=models.CASCADE, related_name='documentos')
    tipo = models.CharField(max_length=20, choices=TIPO_CHOICES)
    arquivo = models.FileField(upload_to=caminho_documento_etapa)
    data_envio = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.get_tipo_display()} – {self.etapa.nome}"

# models.py (acrescente ao final)

from django.contrib.auth import get_user_model

class EquipeObra(models.Model):
    obra = models.ForeignKey(Obra, on_delete=models.CASCADE, related_name='equipe')
    usuario = models.OneToOneField(get_user_model(), on_delete=models.CASCADE, related_name='perfil_equipe')
    nome = models.CharField(max_length=100)
    email = models.EmailField()
    data_convite = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.nome} – {self.obra.nome}"
