package br.gov.servicos.piwik;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Value;
import lombok.experimental.Wither;
import lombok.extern.slf4j.Slf4j;
import java.net.URI;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import static java.util.Arrays.stream;
import static java.util.stream.Stream.concat;
import static java.util.stream.Stream.of;
/**
* Retorno do endpoint Actions.getPageUrls:
* http://developer.piwik.org/api-reference/reporting-api
*/
@Slf4j
@Wither
@Value
@AllArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class PiwikPage {
static final Pattern URL_SERVICO = Pattern.compile("((/servico)|(/repositorioServico))/(?<idServico>.*)");
@JsonProperty("url")
String url;
@JsonProperty("nb_visits")
Long visitors;
@JsonProperty("nb_uniq_visitors")
Long uniqueVisitors;
@JsonProperty("subtable")
PiwikPage[] subPages;
public PiwikPage() {
this("", 0L, 0L, new PiwikPage[0]);
}
public Optional<String> getPath() {
try {
return Optional.of(URI.create(url).getPath());
} catch (IllegalArgumentException e) {
log.warn("Não foi possível criar URI a partir de {}", url, e);
return Optional.empty();
}
}
public Optional<String> getIdServico() {
return getPath()
.map(URL_SERVICO::matcher)
.filter(Matcher::find)
.map(m -> m.group("idServico"));
}
public Stream<PiwikPage> flattened() {
return concat(
of(this),
stream(subPages).flatMap(PiwikPage::flattened)
);
}
}