public static BigDecimal calcula(Sessao sessao, Integer quantidade) {
    BigDecimal preco;

    Integer totalIngressos = sessao.getTotalIngressos();

    Integer ingressosReservados = sessao.getIngressosReservados();

    TipoDeEspetaculo tipoEspetaculo = sessao.getEspetaculo().getTipo();

    BigDecimal precoSessao = sessao.getPreco();

    preco = precoSessao;

    int diffIngressos = totalIngressos - ingressosReservados;

    switch (tipoEspetaculo) {
      case CINEMA:
        if (diffIngressos / totalIngressos.doubleValue() <= 0.05) {
          preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.10)));
        }
        break;

      case SHOW:
        // quando estiver acabando os ingressos...
        if (diffIngressos / totalIngressos.doubleValue() <= 0.05) {
          preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.10)));
        }
        break;

      case BALLET:
        if (diffIngressos / totalIngressos.doubleValue() <= 0.50) {
          preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.20)));
        }

        if (sessao.getDuracaoEmMinutos() > 60) {
          preco = preco.add(precoSessao.multiply(BigDecimal.valueOf(0.10)));
        }
        break;
      case ORQUESTRA:
        if (diffIngressos / totalIngressos.doubleValue() <= 0.50) {
          preco = precoSessao.add(precoSessao.multiply(BigDecimal.valueOf(0.20)));
        }
        if (sessao.getDuracaoEmMinutos() > 60) {
          preco = preco.add(precoSessao.multiply(BigDecimal.valueOf(0.10)));
        }
        break;
      default:
        // nao aplica aumento para teatro (quem vai é pobretão)
        preco = precoSessao;
        break;
    }

    return preco.multiply(BigDecimal.valueOf(quantidade));
  }
  public static BigDecimal calcula(Sessao sessao, Integer quantidade) {
    BigDecimal preco = sessao.getPreco();

    if (sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.CINEMA)
        || sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.SHOW)) {
      if (Sessao.calculaFatorDisponivelSobreTotal(sessao) <= 0.05) {
        double fatorReajuste = 0.10;
        preco = Sessao.reajustarSessao(sessao, fatorReajuste);
      }
    } else if (sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.BALLET)
        || sessao.getEspetaculo().getTipo().equals(TipoDeEspetaculo.ORQUESTRA)) {
      if (Sessao.calculaFatorDisponivelSobreTotal(sessao) <= 0.50) {
        double fatorReajuste = 0.20;
        preco = Sessao.reajustarSessao(sessao, fatorReajuste);
      }

      if (sessao.getDuracaoEmMinutos() > UMA_HORA) {
        double fatorReajuste = 0.10;
        preco = preco.add(sessao.getPreco().multiply(BigDecimal.valueOf(fatorReajuste)));
      }
    }
    return preco.multiply(BigDecimal.valueOf(quantidade));
  }