"""
Exemplos de uso do Cakto API Python Client
==========================================
"""

from cakto import CaktoClient, CaktoError

# =============================================================================
# Configuração
# =============================================================================

CLIENT_ID = 'seu_client_id'
CLIENT_SECRET = 'seu_client_secret'


def exemplo_basico():
    """Exemplo básico de conexão e listagem."""
    client = CaktoClient(CLIENT_ID, CLIENT_SECRET)

    # Testar conexão
    if client.test_connection():
        print("Conectado com sucesso!")

    # Listar produtos
    products = client.products.list()
    print(f"Total de produtos: {products.count}")

    for product in products.results:
        print(f"  - {product['name']}: R${product['price']}")


def exemplo_produtos():
    """Exemplo de gerenciamento de produtos."""
    client = CaktoClient(CLIENT_ID, CLIENT_SECRET)

    # Listar produtos ativos
    products = client.products.list(status='active', ordering='-price')

    print(f"Produtos ativos: {products.count}")

    # Filtrar por preço
    expensive = client.products.list(price__gte=100)
    print(f"Produtos acima de R$100: {expensive.count}")

    # Buscar por nome
    results = client.products.list(search='curso')
    print(f"Produtos com 'curso': {results.count}")

    # Obter produto específico
    if products.results:
        product_id = products.results[0]['id']
        product = client.products.get(product_id)
        print(f"\nDetalhes: {product['name']}")
        print(f"  Tipo: {product['type']}")
        print(f"  Status: {product['status']}")
        print(f"  Pagamentos: {', '.join(product['paymentMethods'])}")


def exemplo_ofertas():
    """Exemplo de gerenciamento de ofertas."""
    client = CaktoClient(CLIENT_ID, CLIENT_SECRET)

    # Listar ofertas
    offers = client.offers.list(status='active')
    print(f"Ofertas ativas: {offers.count}")

    # Criar oferta de compra única
    # nova_oferta = client.offers.create(
    #     name='Black Friday',
    #     price=97.00,
    #     product='uuid-do-produto',
    #     type='unique',
    #     intervalType='lifetime'
    # )
    # print(f"Oferta criada: {nova_oferta['id']}")

    # Criar oferta de assinatura
    # assinatura = client.offers.create(
    #     name='Plano Mensal',
    #     price=29.90,
    #     product='uuid-do-produto',
    #     type='subscription',
    #     recurrence_period=30,
    #     quantity_recurrences=-1,  # Infinito
    #     trial_days=7
    # )

    # Atualizar preço
    # client.offers.update('offer_id', price=147.00)

    # Deletar oferta
    # client.offers.delete('offer_id')


def exemplo_pedidos():
    """Exemplo de gerenciamento de pedidos."""
    client = CaktoClient(CLIENT_ID, CLIENT_SECRET)

    # Listar pedidos pagos
    paid = client.orders.list(status='paid', ordering='-paidAt')
    print(f"Pedidos pagos: {paid.count}")

    # Filtrar por data
    from datetime import datetime, timedelta
    mes_passado = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')

    recent = client.orders.list(
        status='paid',
        paidAt__gte=mes_passado,
        ordering='-amount'
    )
    print(f"Pedidos últimos 30 dias: {recent.count}")

    # Calcular faturamento
    total = sum(order['amount'] for order in recent.results)
    print(f"Faturamento: R${total:.2f}")

    # Filtrar por método de pagamento
    pix_orders = client.orders.list(paymentMethod='pix', status='paid')
    print(f"Vendas via PIX: {pix_orders.count}")

    # Pedidos com upsell
    upsells = client.orders.list(offer_type='upsell', status='paid')
    print(f"Upsells: {upsells.count}")

    # Iterar por TODOS os pedidos (paginação automática)
    # for order in client.orders.list_all(status='paid'):
    #     print(f"Pedido {order['refId']}: R${order['amount']}")

    # Reembolsar pedido
    # client.orders.refund('order_id')

    # Reenviar email de acesso
    # client.orders.resend_email('order_id')
    # client.orders.resend_access('order_id')


def exemplo_webhooks():
    """Exemplo de gerenciamento de webhooks."""
    client = CaktoClient(CLIENT_ID, CLIENT_SECRET)

    # Listar webhooks
    webhooks = client.webhooks.list()
    print(f"Webhooks configurados: {webhooks.count}")

    # Criar webhook para vendas
    # webhook = client.webhooks.create(
    #     name='Notificação Vendas',
    #     url='https://meusite.com/api/webhook/cakto',
    #     events=[
    #         'purchase_approved',
    #         'purchase_refused',
    #         'refund',
    #         'chargeback'
    #     ]
    # )
    # print(f"Webhook criado: {webhook['id']}")

    # Criar webhook para assinaturas
    # sub_webhook = client.webhooks.create(
    #     name='Assinaturas',
    #     url='https://meusite.com/api/webhook/subscriptions',
    #     events=[
    #         'subscription_created',
    #         'subscription_renewed',
    #         'subscription_canceled',
    #         'subscription_renewal_refused'
    #     ]
    # )

    # Criar webhook para carrinho abandonado
    # abandoned = client.webhooks.create(
    #     name='Carrinho Abandonado',
    #     url='https://meusite.com/api/webhook/abandoned',
    #     events=['checkout_abandonment']
    # )

    # Ver todos os eventos disponíveis
    print("\nEventos disponíveis:")
    for event in client.webhooks.ALL_EVENTS:
        print(f"  - {event}")

    # Testar webhook
    # client.webhooks.test('webhook_id')

    # Ver histórico de eventos
    # history = client.webhooks.event_history()
    # for event in history.results:
    #     print(f"Evento: {event}")

    # Reenviar evento
    # client.webhooks.resend_event('event_id')


def exemplo_relatorio_vendas():
    """Exemplo: Gerar relatório de vendas."""
    client = CaktoClient(CLIENT_ID, CLIENT_SECRET)

    from datetime import datetime, timedelta
    from collections import defaultdict

    # Período: últimos 30 dias
    inicio = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')
    fim = datetime.now().strftime('%Y-%m-%d')

    print(f"Relatório de Vendas: {inicio} a {fim}")
    print("=" * 50)

    # Buscar pedidos pagos
    orders = client.orders.list(
        status='paid',
        paidAt__gte=inicio,
        paidAt__lte=fim,
        limit=100
    )

    # Métricas básicas
    total_vendas = orders.count
    total_valor = sum(o['amount'] for o in orders.results)
    ticket_medio = total_valor / total_vendas if total_vendas > 0 else 0

    print(f"Total de vendas: {total_vendas}")
    print(f"Faturamento: R${total_valor:.2f}")
    print(f"Ticket médio: R${ticket_medio:.2f}")

    # Por método de pagamento
    por_metodo = defaultdict(lambda: {'count': 0, 'total': 0})
    for order in orders.results:
        metodo = order.get('paymentMethod', 'unknown')
        por_metodo[metodo]['count'] += 1
        por_metodo[metodo]['total'] += order['amount']

    print("\nPor método de pagamento:")
    for metodo, dados in por_metodo.items():
        print(f"  {metodo}: {dados['count']} vendas - R${dados['total']:.2f}")

    # Reembolsos
    refunds = client.orders.list(
        status='refunded',
        refundedAt__gte=inicio,
        refundedAt__lte=fim
    )

    total_reembolsos = sum(o['amount'] for o in refunds.results)
    print(f"\nReembolsos: {refunds.count} (R${total_reembolsos:.2f})")

    # Taxa de reembolso
    taxa_reembolso = (refunds.count / total_vendas * 100) if total_vendas > 0 else 0
    print(f"Taxa de reembolso: {taxa_reembolso:.1f}%")


def exemplo_automacao_reembolso():
    """Exemplo: Automação de reembolso."""
    client = CaktoClient(CLIENT_ID, CLIENT_SECRET)

    # Buscar pedidos aguardando pagamento há mais de 7 dias
    from datetime import datetime, timedelta
    limite = (datetime.now() - timedelta(days=7)).strftime('%Y-%m-%d')

    pendentes = client.orders.list(
        status='waiting_payment',
        createdAt__lte=limite
    )

    print(f"Pedidos pendentes há mais de 7 dias: {pendentes.count}")

    # Para cada pedido, você pode tomar ações
    # for order in pendentes.results:
    #     print(f"Cancelando pedido {order['refId']}...")
    #     # Sua lógica aqui


def exemplo_integracao_webhook():
    """
    Exemplo: Como receber webhooks (Flask).

    Este é um exemplo de endpoint para receber webhooks da Cakto.
    """
    exemplo_codigo = '''
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/webhook/cakto', methods=['POST'])
def webhook_cakto():
    data = request.json
    event = data.get('event')

    if event == 'purchase_approved':
        # Venda aprovada
        order_id = data.get('order_id')
        customer_email = data.get('customer', {}).get('email')
        amount = data.get('amount')

        print(f"Nova venda! {customer_email} - R${amount}")

        # Sua lógica: enviar email, liberar acesso, etc.

    elif event == 'refund':
        # Reembolso
        order_id = data.get('order_id')
        print(f"Reembolso: {order_id}")

        # Sua lógica: revogar acesso, etc.

    elif event == 'checkout_abandonment':
        # Carrinho abandonado
        email = data.get('customer', {}).get('email')
        product = data.get('product', {}).get('name')

        print(f"Carrinho abandonado: {email} - {product}")

        # Sua lógica: enviar email de recuperação

    elif event == 'subscription_canceled':
        # Assinatura cancelada
        customer = data.get('customer', {})
        print(f"Cancelamento: {customer.get('email')}")

        # Sua lógica: pesquisa de cancelamento, etc.

    return jsonify({'status': 'ok'}), 200

if __name__ == '__main__':
    app.run(port=5000)
'''
    print("Exemplo de endpoint Flask para webhooks:")
    print(exemplo_codigo)


# =============================================================================
# Main
# =============================================================================

if __name__ == '__main__':
    print("Cakto API - Exemplos de Uso")
    print("=" * 50)
    print()
    print("Configure suas credenciais nas variáveis:")
    print("  CLIENT_ID = 'seu_client_id'")
    print("  CLIENT_SECRET = 'seu_client_secret'")
    print()
    print("Exemplos disponíveis:")
    print("  1. exemplo_basico() - Conexão e listagem")
    print("  2. exemplo_produtos() - Gerenciamento de produtos")
    print("  3. exemplo_ofertas() - Gerenciamento de ofertas")
    print("  4. exemplo_pedidos() - Gerenciamento de pedidos")
    print("  5. exemplo_webhooks() - Gerenciamento de webhooks")
    print("  6. exemplo_relatorio_vendas() - Relatório de vendas")
    print("  7. exemplo_automacao_reembolso() - Automação")
    print("  8. exemplo_integracao_webhook() - Receber webhooks")
    print()
    print("Execute com:")
    print("  python -c \"from examples import *; exemplo_basico()\"")
