from datetime import datetime
from . import db

class Pessoa(db.Model):
    __tablename__ = 'pessoas'

    __table_args__ = (
        db.Index('idx_pessoas_campanha_criado_em', 'campanha_id', 'criado_em'),
        db.Index('idx_pessoas_campanha_cadastrador', 'campanha_id', 'cadastrador_id'),
        db.Index('idx_pessoas_campanha_zona', 'campanha_id', 'zona'),
        db.Index('idx_pessoas_campanha_bairro', 'campanha_id', 'bairro'),
        db.Index('idx_pessoas_cadastrador_criado_em', 'cadastrador_id', 'criado_em'),
    )

    id = db.Column(db.Integer, primary_key=True)
    nome_completo = db.Column(db.String(150), nullable=False)
    cpf = db.Column(db.String(14), nullable=True)
    telefone = db.Column(db.String(30), nullable=True)
    data_nascimento = db.Column(db.Date, nullable=True)
    sexo = db.Column(db.String(20), nullable=True)
    
    # Endereço e Territorialização
    cep = db.Column(db.String(10), nullable=True)
    rua = db.Column(db.String(150), nullable=True)
    numero = db.Column(db.String(20), nullable=True)
    complemento = db.Column(db.String(100), nullable=True)
    ponto_referencia = db.Column(db.String(150), nullable=True)
    bairro = db.Column(db.String(100), nullable=False)
    zona = db.Column(db.String(50), nullable=False, default='Zona Norte')
    municipio = db.Column(db.String(100), nullable=False, default='Manaus')
    estado = db.Column(db.String(2), nullable=False, default='AM')
    
    # Coordenadas geográficas para mapas/PostGIS
    lat = db.Column(db.Float, nullable=True)
    lng = db.Column(db.Float, nullable=True)
    
    # Rastreabilidade e Vínculos
    cadastrador_id = db.Column(db.Integer, db.ForeignKey('usuarios.id'), nullable=False)
    campanha_id = db.Column(db.Integer, db.ForeignKey('campanhas.id'), nullable=False)
    
    # Vinculação explícita se a Pessoa virou também um Usuario do sistema (RN-CAD-04)
    usuario_id = db.Column(db.Integer, db.ForeignKey('usuarios.id'), nullable=True)
    
    # Dados do Título de Eleitor
    titulo_eleitor = db.Column(db.String(30), nullable=True)
    zona_eleitoral = db.Column(db.String(10), nullable=True)
    secao_eleitoral = db.Column(db.String(10), nullable=True)

    observacao = db.Column(db.Text, nullable=True)
    
    # PWA / Offline Sync
    sincronizado_offline = db.Column(db.Boolean, default=False)
    client_uuid = db.Column(db.String(64), nullable=True, unique=True)
    
    criado_em = db.Column(db.DateTime, default=datetime.utcnow)

    # Relationship vinculada
    usuario_conta = db.relationship('Usuario', foreign_keys=[usuario_id], backref='pessoa_vinculada', uselist=False)

    def to_dict(self):
        return {
            'id': self.id,
            'nome_completo': self.nome_completo,
            'cpf': self.cpf,
            'telefone': self.telefone,
            'data_nascimento': self.data_nascimento.strftime('%Y-%m-%d') if self.data_nascimento else None,
            'sexo': self.sexo,
            'cep': self.cep,
            'rua': self.rua,
            'numero': self.numero,
            'complemento': self.complemento,
            'ponto_referencia': self.ponto_referencia,
            'bairro': self.bairro,
            'zona': self.zona,
            'municipio': self.municipio,
            'estado': self.estado,
            'lat': self.lat,
            'lng': self.lng,
            'cadastrador_id': self.cadastrador_id,
            'cadastrador_nome': self.cadastrador.nome if self.cadastrador else 'N/A',
            'campanha_id': self.campanha_id,
            'usuario_id': self.usuario_id,
            'titulo_eleitor': self.titulo_eleitor,
            'zona_eleitoral': self.zona_eleitoral,
            'secao_eleitoral': self.secao_eleitoral,
            'observacao': self.observacao,
            'sincronizado_offline': self.sincronizado_offline,
            'criado_em': self.criado_em.strftime('%d/%m/%Y %H:%M')
        }
