from datetime import datetime, timedelta

def status_assinatura(user):
    """
    Retorna um dicionário com o status completo da assinatura do usuário.
    
    Possíveis status:
    - 'gratuito': nunca teve premium, ou premium já encerrado de vez
    - 'premium': premium ativo e em dia
    - 'carencia': premium venceu, mas ainda dentro dos 3 dias de aviso
    - 'expirado': venceu e passou da carência (hora de fazer o downgrade)
    """
    agora = datetime.utcnow()

    if user.plano != 'premium' or not user.premium_expira_em:
        return {
            'status': 'gratuito',
            'pode_usar_premium': False,
            'dias_carencia_restantes': None,
            'pode_pedir_cortesia': False,
        }

    if user.premium_expira_em > agora:
        return {
            'status': 'premium',
            'pode_usar_premium': True,
            'dias_carencia_restantes': None,
            'pode_pedir_cortesia': False,
        }

    fim_carencia = user.premium_expira_em + timedelta(days=3)

    if agora <= fim_carencia:
        dias_restantes = (fim_carencia - agora).days + 1
        return {
            'status': 'carencia',
            'pode_usar_premium': True,
            'dias_carencia_restantes': dias_restantes,
            'pode_pedir_cortesia': not user.extensao_cortesia_usada,
        }

    return {
        'status': 'expirado',
        'pode_usar_premium': False,
        'dias_carencia_restantes': 0,
        'pode_pedir_cortesia': not user.extensao_cortesia_usada,
    }


def aplicar_cortesia(user):
    """
    Aplica a extensão de cortesia de 3 dias, uma única vez por conta.
    Retorna True se aplicou, False se já tinha sido usada antes.
    """
    if user.extensao_cortesia_usada:
        return False

    agora = datetime.utcnow()
    nova_expiracao = agora + timedelta(days=3)
    user.premium_expira_em = nova_expiracao
    user.extensao_cortesia_usada = True
    return True