docs: @Override
      public Fighter parseDocument(Document doc) throws IOException {
          Fighter fighter = new Fighter();
          fighter.setSherdogUrl(ParserUtils.getSherdogPageUrl(doc));
  
          logger.info("Refreshing fighter {}", fighter.getSherdogUrl());
  
  
          try {
              Elements name = doc.select(".bio_fighter h1 span.fn");
              fighter.setName(name.get(0).html());
          } catch (Exception e) {
              // no info, skipping
          }
  
          // Getting nick name
          try {
              Elements nickname = doc.select(".bio_fighter span.nickname em");
              fighter.setNickname(nickname.get(0).html());
          } catch (Exception e) {
              // no info, skipping
          }
  
          // Birthday
          try {
              Elements birthday = doc.select("span[itemprop=\"birthDate\"]");
              fighter.setBirthday(df.parse(birthday.get(0).html()));
          } catch (Exception e) {
              // no info, skipping
          }
          // height
          try {
              Elements height = doc.select(".size_info .height strong");
              fighter.setHeight(height.get(0).html());
          } catch (Exception e) {
              // no info, skipping
          }
          // weight
          try {
              Elements weight = doc.select(".size_info .weight strong");
              fighter.setWeight(weight.get(0).html());
          } catch (Exception e) {
              // no info, skipping
          }
          // wins
          try {
              Elements wins = doc.select(".bio_graph .counter");
              fighter.setWins(Integer.parseInt(wins.get(0).html()));
          } catch (Exception e) {
              // no info, skipping
          }
          Elements winsMethods = doc.select(".bio_graph:first-of-type .graph_tag");
          try {
              fighter.setWinsKo(Integer.parseInt(winsMethods.get(METHOD_KO).html().split(" ")[0]));
          } catch (Exception e) {
              // no info, skipping
          }
  
          try {
              fighter.setWinsSub(Integer.parseInt(winsMethods.get(METHOD_SUBMISSION).html().split(" ")[0]));
          } catch (Exception e) {
              // no info, skipping
          }
  
          try {
              fighter.setWinsDec(Integer.parseInt(winsMethods.get(METHOD_DECISION).html().split(" ")[0]));
          } catch (Exception e) {
              // no info, skipping
          }
  
  
          try {
              fighter.setWinsOther(Integer.parseInt(winsMethods.get(METHOD_OTHERS).html().split(" ")[0]));
          } catch (Exception e) {
              // no info, skipping
          }
          // loses
          try {
              Elements losses = doc.select(".bio_graph.loser .counter");
              fighter.setLosses(Integer.parseInt(losses.get(0).html()));
          } catch (Exception e) {
              // no info, skipping
          }
  
          Elements lossesMethods = doc.select(".bio_graph.loser .graph_tag");
  
  
          try {
  
              fighter.setLossesKo((Integer.parseInt(lossesMethods.get(METHOD_KO).html().split(" ")[0])));
          } catch (Exception e) {
              // no info, skipping
          }
  
          try {
              fighter.setLossesSub(Integer.parseInt(lossesMethods.get(METHOD_SUBMISSION).html().split(" ")[0]));
          } catch (Exception e) {
              // no info, skipping
          }
  
          try {
              fighter.setLossesDec(Integer.parseInt(lossesMethods.get(METHOD_DECISION).html().split(" ")[0]));
          } catch (Exception e) {
              // no info, skipping
          }
  
          try {
              fighter.setLossesOther(Integer.parseInt(lossesMethods.get(METHOD_OTHERS).html().split(" ")[0]));
          } catch (Exception e) {
              // no info, skipping
          }
          // draws and NC
          Elements drawsNc = doc.select(".right_side .bio_graph .card");
          for (Element element : drawsNc) {
  
              switch (element.select("span.result").html()) {
                  case "Draws":
                      fighter.setDraws(Integer.parseInt(element.select("span.counter").html()));
                      break;
  
                  case "N/C":
                      fighter.setNc(Integer.parseInt(element.select("span.counter").html()));
                      break;
              }
  
          }
  
          Elements picture = doc.select(".bio_fighter .content img[itemprop=\"image\"]");
          String pictureUrl = "https://www.sherdog.com" + picture.attr("src").trim();
  
  
          Elements fightTables = doc.select(".fight_history");
          logger.info("Found {} fight history tables", fightTables.size());
  
  
          fightTables.stream()
                  //excluding upcoming fights
                  .filter(div -> !div.select(".module_header h2").html().trim().contains("Upcoming"))
                  .collect(Collectors.groupingBy(div -> {
                      String categoryName = div.select(".module_header h2").html().trim().replaceAll("(?i)FIGHT HISTORY - ", "").trim();
  
                      return FightType.fromString(categoryName);
                  }))
                  .forEach((key, div) -> div.stream()
                          .map(d -> d.select(".table table tr"))
                          .filter(tdList -> tdList.size() > 0)
                          .findFirst()
                          .ifPresent(tdList -> {
                                      List<Fight> f = getFights(tdList, fighter);
  
                                      f.forEach(fight -> fight.setType(key));
  
                                      fighter.getFights().addAll(f);
                                  }
                          ));
  
          List<Fight> sorted = fighter.getFights()
                  .stream()
                  .sorted(Comparator.comparing(Fight::getDate, Comparator.nullsFirst(Comparator.naturalOrder())))
                  .collect(Collectors.toList());
  
          fighter.setFights(sorted);
  
  
          logger.info("Found {} fights for {}", fighter.getFights().size(), fighter.getName());
  
          //setting the picture last to make sure the fighter variable has all the data
          if (pictureUrl.length() > 0) {
              fighter.setPicture(PROCESSOR.process(pictureUrl, fighter));
          }
  
          return fighter;
      }