
ResultadoJugada TCIC_jugar_baza(EstadoPartida *partida, uint8_t carta_i, uint16_t partida_i){};
ResultadoJugada TCIC_cantar(EstadoPartida *partida, uint8_t canto, uint16_t partida_i){};
ResultadoJugada TCIC_cantar_tanto(EstadoPartida *partida, uint16_t partida_i){};

void TCIC_render_controles_carta(uint8_t carta_i, uint8_t carta_id, uint16_t partida_i){};
void TCIC_render_controles_canto(uint8_t canto_i, uint16_t partida_i){};
void TCIC_render_controles_canto_tantos(uint8_t tantos, uint16_t partida_i){};

void TCIC_render_jugada_invalida(uint8_t jugador_i, uint16_t partida_i){};
void TCIC_render_carta_jugada(uint8_t jugador_i, uint8_t carta_i, uint16_t partida_i){};
void TCIC_render_canto_realizado(uint8_t jugador_i, uint8_t canto_i, uint16_t partida_i){};
void TCIC_render_tantos_cantados(uint8_t jugador_i, uint8_t tantos, uint16_t partida_i){};
void TCIC_render_puntos_ganados(uint8_t equipo_puntero, uint8_t puntos_ganados){};
void TCIC_render_puntaje(uint8_t puntos_1, uint8_t puntos_2, uint16_t partida_i){};
void TCIC_render_ronda_terminada(uint8_t ganador_i, uint8_t mano_i, uint16_t partida_i){};
void TCIC_render_victoria(uint8_t equipo_i, uint16_t partida_i){};
void TCIC_render_nueva_baza(uint8_t baza_i, uint16_t partida_i){};
void TCIC_render_envido_no_disponible(uint16_t partida_i){};
void TCIC_render_tiene_retruco(uint8_t equipo_i, uint16_t partida_i){};


void TCIC_render_mensaje_por_resultado(ResultadoJugada *resultado_jugada, EstadoPartida *estado_partida, uint16_t partida_i){
    if(!resultado_jugada->eventos){
        TCIC_render_jugada_invalida(resultado_jugada->jugador, partida_i); printf("\nJugada inválida");
        return;
    }

    if(resultado_jugada->puntos_ganados > 0){
        TCIC_render_puntaje(estado_partida->equipos_puntos[0], estado_partida->equipos_puntos[1], partida_i);
        TCIC_render_puntos_ganados(resultado_jugada->equipo_ganador, resultado_jugada->puntos_ganados);
    }

    if(IS_BIT_SET(resultado_jugada->eventos, EVENTO_CARTA_JUGADA)){
        uint8_t carta_jugada_i = resultado_jugada->carta;
        if(carta_jugada_i == CARTA_INVALIDA){
            TCIC_render_jugada_invalida(resultado_jugada->jugador, partida_i);
            return;
        }

        TCIC_render_carta_jugada(resultado_jugada->jugador, carta_jugada_i, partida_i);
        printf("Jugador %u jugó: %u de %s\n\n", resultado_jugada->jugador, cartas[carta_jugada_i].valor_carta, 
        nombrePalo(cartas[carta_jugada_i].palo));
    }

    if(IS_BIT_SET(resultado_jugada->eventos, EVENTO_CANTO)){
        TCIC_render_canto_realizado(resultado_jugada->jugador, resultado_jugada->canto, partida_i); 
        printf("Jugador %u cantó: %s\n", resultado_jugada->jugador, nombreCanto(resultado_jugada->canto));
    }
    if(IS_BIT_SET(resultado_jugada->eventos, EVENTO_TANTOS_CANTADOS)){
        TCIC_render_tantos_cantados(resultado_jugada->jugador, resultado_jugada->tantos_cantados, partida_i); 
    }

    if(IS_BIT_SET(resultado_jugada->eventos, EVENTO_VICTORIA)){
        TCIC_render_victoria(resultado_jugada->equipo_ganador, partida_i);
        printf("%s %u gana la partida.\n\n", jugador_o_equipo(jugadores), resultado_jugada->equipo_ganador+1);
        return;
    }


    if(IS_BIT_SET(resultado_jugada->eventos, EVENTO_RONDA_TERMINADA)){
        TCIC_render_ronda_terminada(partida_i);
        printf("%s %u gana la ronda.\n\n", jugador_o_equipo(jugadores), resultado_jugada->equipo_ganador+1);
        return;
    }

    if(IS_BIT_SET(resultado_jugada->eventos, EVENTO_NUEVA_BAZA)){
        TCIC_render_nueva_baza(estado_partida->baza_actual, partida_i);
    }

    if(IS_BIT_SET(resultado_jugada->eventos, EVENTO_ENVIDO_NO_DISPONIBLE)){
        TCIC_render_envido_no_disponible(partida_i);
    }

    if(IS_BIT_SET(resultado_jugada->eventos, EVENTO_TIENE_RETRUCO)){
        TCIC_render_tiene_retruco(resultado_jugada->equipo_ganador, partida_i);
    }
}

uint8_t TCIC_obtener_truco_disponible(EstadoPartida *estado_partida){
    switch(estado_partida->ronda_estado){
        case RONDA_ESTADO_JUGANDO_BAZA:
            if(!IS_BIT_SET(estado_partida->flags_ronda, FLAG_TRUCO)) return FLAG_TRUCO;
            else if(IS_BIT_SET(estado_partida->flags_ronda, FLAG_TIENE_RETRUCO) == ((estado_partida->jugador_turno_actual) % 2)){
                if(!IS_BIT_SET(estado_partida->flags_ronda, FLAG_VALE_CUATRO)){
                    if(IS_BIT_SET(estado_partida->flags_ronda, FLAG_RETRUCO)) return FLAG_VALE_CUATRO;
                    return FLAG_RETRUCO;
                }
            }
        break;
        case RONDA_ESTADO_EN_CANTO:
            if(estado_partida->canto_ofrecido >= CANTO_TRUCO && estado_partida->canto_ofrecido < CANTO_VALE_CUATRO) return estado_partida->canto_ofrecido+1;
        break;
        default: break;
    }
    return CANTO_INVALIDO;
}

void TCIC_mostrar_controles_baza(EstadoPartida *estado_partida, uint16_t partida_i){
    for(uint8_t carta_i = 0; carta_i < 3; carta_i++){
        uint8_t carta = jugador_cartas[carta_i];
        if(carta == CARTA_INVALIDA) continue;
        TCIC_render_controles_carta(carta_i, carta, partida_i);
    }

    uint8_t truco_disponible = TCIC_obtener_truco_disponible(estado_partida);

    if(truco_disponible != CANTO_INVALIDO) TCIC_render_controles_canto(truco_disponible); printf("\n3: %s!", nombreCanto(truco_disponible));

    if(!IS_BIT_SET(estado_partida->flags_ronda, FLAG_ENVIDO_NO_DISPONIBLE)){
        TCIC_render_controles_canto(CANTO_ENVIDO); printf("\n6: Envido");
        TCIC_render_controles_canto(CANTO_REAL_ENVIDO); printf("\n8: Real Envido");
        TCIC_render_controles_canto(CANTO_FALTA_ENVIDO); printf("\n9: Falta Envido");
    }

    TCIC_render_controles_canto(CANTO_ME_VOY_AL_MAZO); printf("\n10: Me voy al mazo");
}

void TCIC_mostrar_controles_canto(EstadoPartida *estado_partida, uint16_t partida_i){
    if(estado_partida->canto_ofrecido >= FLAG_TRUCO && estado_partida->canto_ofrecido < FLAG_VALE_CUATRO){
        TCIC_render_controles_canto(estado_partida->canto_ofrecido+1); printf("\n\n3: %s!", nombreCanto(estado_partida->canto_ofrecido+1));
        if(!IS_BIT_SET(flags_ronda, FLAG_ENVIDO_NO_DISPONIBLE)) TCIC_render_controles_canto(CANTO_ENVIDO);
    }
    else if(estado_partida->canto_ofrecido >= FLAG_ENVIDO && estado_partida->canto_ofrecido < FLAG_FALTA_ENVIDO){
        for(uint8_t i = estado_partida->canto_ofrecido+1; i <= FLAG_FALTA_ENVIDO; i++){
            TCIC_render_controles_canto(i); printf("\n%u: %s", 6+i-FLAG_ENVIDO , nombreCanto(i));
        }
    }
    TCIC_render_controles_canto(CANTO_QUIERO); printf("\n4: Quiero");
    TCIC_render_controles_canto(CANTO_NO_QUIERO); printf("\n5: No Quiero");

    if(estado_partida->canto_ofrecido >= FLAG_TRUCO && estado_partida->canto_ofrecido <= FLAG_VALE_CUATRO) TCIC_render_controles_canto(CANTO_ME_VOY_AL_MAZO); printf("\n10: Me voy al mazo");
}

void TCIC_mostrar_controles_tantos(EstadoPartida *estado_partida, uint16_t partida_i){
    if(envido > estado_partida->mayor_envido &&
        estado_partida->jugador_mano % 2 == estado_partida->jugador_turno_canto % 2
        ) TCIC_render_controles_canto_tantos(estado_partida, partida_i); printf("\n11: %u", envido);
    if(estado_partida->mayor_envido != 0) TCIC_render_controles_canto(CANTO_SON_BUENAS); printf("\n12: Son buenas");
}

void TCIC_mostrar_controles_a_jugador_actual_segun_estado(EstadoPartida *estado_partida, uint16_t partida_i){

    switch(ronda_estado){
        case RONDA_ESTADO_JUGANDO_BAZA:
            TCIC_mostrar_controles_baza(estado_partida, partida_i);
            break;
        case RONDA_ESTADO_EN_CANTO:
            TCIC_mostrar_controles_canto(estado_partida, partida_i);
            break;
        case RONDA_ESTADO_RONDA_TANTOS:
            TCIC_mostrar_controles_tantos(estado_partida, partida_i);
            break;
        default: break;
    }
}

