import math

# 1. Geração de Dados Sintéticos de Clientes (Idade, Pontuação_Gastos)
# Simulando 3 grupos naturais de clientes
dados_sinteticos = [
    # Grupo 1: Jovens com Gastos Altos
    (22, 85), (25, 90), (20, 78), (28, 88), (23, 95), (21, 82), (24, 80),
    # Grupo 2: Adultos de Meia-Idade com Gastos Moderados
    (45, 40), (50, 42), (52, 55), (48, 48), (42, 38), (55, 50), (49, 45),
    # Grupo 3: Idosos com Gastos Baixos
    (68, 12), (72, 18), (65, 10), (70, 15), (75, 20), (62, 8), (69, 14)
]

def calcular_distancia(p1, p2):
    """Calcula a Distância Euclidiana entre dois pontos 2D."""
    return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)

def executar_kmeans_sintetico(dados, k, max_iter=10):
    """Executa o algoritmo K-Means e retorna os centroides e a Inércia (WCSS)."""
    # Inicializa os K primeiros pontos como centroides
    centroides = dados[:k]
    
    for _ in range(max_iter):
        # Etapa de Atribuição
        clusters = [[] for _ in range(k)]
        for ponto in dados:
            distancias = [calcular_distancia(ponto, c) for c in centroides]
            idx_menor = distancias.index(min(distancias))
            clusters[idx_menor].append(ponto)
            
        # Etapa de Atualização dos Centroides
        novos_centroides = []
        for cluster in clusters:
            if len(cluster) > 0:
                media_x = sum(p[0] for p in cluster) / len(cluster)
                media_y = sum(p[1] for p in cluster) / len(cluster)
                novos_centroides.append((media_x, media_y))
            else:
                novos_centroides.append((0, 0))
        centroides = novos_centroides

    # Cálculo da Inércia (Soma das Distâncias Quadráticas Intra-cluster)
    inercia = 0.0
    for i, cluster in enumerate(clusters):
        for ponto in cluster:
            inercia += calcular_distancia(ponto, centroides[i]) ** 2
            
    return k, inercia, centroides

# 2. Avaliação da Inércia para diferentes valores de K (Método do Cotovelo)
print("=== MÉTODO DO COTOVELO (ELBOW METHOD) - DADOS SINTÉTICOS ===")
print(f"{'Número de Clusters (K)':<25} | {'Inércia (WCSS)':<20}")
print("-" * 50)

for k_teste in range(1, 5):
    k, inercia, _ = executar_kmeans_sintetico(dados_sinteticos, k=k_teste)
    print(f"{k:<25} | {inercia:<20.2f}")