#include "Partida.h"

Partida::Partida(std::shared_ptr<Jugador> j1, std::shared_ptr<Jugador> j2)
    : m_j1(j1), m_j2(j2), m_estado(Estado::PENDIENTE)
{}

Partida::Partida(std::shared_ptr<Jugador> bye)
    : m_j1(bye), m_ganador(bye), m_estado(Estado::BYE)
{
    // BYE: el jugador avanza automáticamente
}

void Partida::iniciar() {
    if (m_estado == Estado::PENDIENTE)
        m_estado = Estado::EN_CURSO;
}

void Partida::registrarResultado(std::shared_ptr<Jugador> ganador) {
    if (m_estado == Estado::FINALIZADA || m_estado == Estado::BYE) return;

    // Validar que el ganador sea uno de los dos participantes
    if (ganador != m_j1 && ganador != m_j2) return;

    m_ganador = ganador;
    m_estado  = Estado::FINALIZADA;

    auto perdedor = (ganador == m_j1) ? m_j2 : m_j1;
    ganador->registrarVictoria();
    perdedor->registrarDerrota();
    perdedor->eliminar();
}

void Partida::resetear() {
    if (m_estado == Estado::BYE) return;
    m_ganador.reset();
    m_estado = Estado::PENDIENTE;
}

QString Partida::descripcion() const {
    if (m_estado == Estado::BYE)
        return QString("BYE → %1").arg(m_j1 ? m_j1->getAlias() : "?");

    QString j1 = m_j1 ? m_j1->getAlias() : "TBD";
    QString j2 = m_j2 ? m_j2->getAlias() : "TBD";
    QString ganador = m_ganador ? m_ganador->getAlias() : "-";

    switch (m_estado) {
    case Estado::PENDIENTE:  return QString("%1  vs  %2").arg(j1, j2);
    case Estado::EN_CURSO:   return QString("▶ %1  vs  %2").arg(j1, j2);
    case Estado::FINALIZADA: return QString("%1  vs  %2  →  🏆 %3").arg(j1, j2, ganador);
    default: return "";
    }
}
