package eu.dnetlib.repo.manager.service;

import eu.dnetlib.repo.manager.service.customHystrixCommands.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.HashMap;
import java.util.Map;

@Service("statsService")
public class StatsServiceImpl implements StatsService {

    @Autowired
    RestTemplate restTemplate;

    @Value("${search.api.baseAddress}")
    private String baseAddress;
    @Value("${search.api.usagestats}")
    private String usagestatsBaseAddress;
    @Value("${search.api.usageEvents}")
    private String usagestatsEvents;

    @Override
    public Map getStatistics()  {

        UsageStatsTotalHystrixCommand usageStatsTotalHystrixCommand = new UsageStatsTotalHystrixCommand(usagestatsEvents,restTemplate);
        DataRepositoriesHystrixCommand dataRepositoriesHystrixCommand = new DataRepositoriesHystrixCommand(baseAddress,restTemplate);
        AggregatorsHystrixCommand aggregatorsHystrixCommand = new AggregatorsHystrixCommand(baseAddress,restTemplate);
        LiteratureHystrixCommand literatureHystrixCommand = new LiteratureHystrixCommand(baseAddress,restTemplate);
        JournalHystrixCommand journalHystrixCommand = new JournalHystrixCommand(baseAddress,restTemplate);
        PublicationHystrixCommand publicationHystrixCommand = new PublicationHystrixCommand(baseAddress,restTemplate);
        DatasetsHystrixCommand datasetsHystrixCommand = new DatasetsHystrixCommand(baseAddress,restTemplate);
        SoftwareHystrixCommand softwareHystrixCommand = new SoftwareHystrixCommand(baseAddress,restTemplate);
        LastYearUsageStatsHystrixCommand lastYearUsageStatsHystrixCommand = new LastYearUsageStatsHystrixCommand(usagestatsBaseAddress,restTemplate);

        Map<String,Object> stats = new HashMap<>();
        stats.put("aggregators",aggregatorsHystrixCommand.execute());
        stats.put("dataRepositories",dataRepositoriesHystrixCommand.execute());
        stats.put("literature",literatureHystrixCommand.execute());
        stats.put("journal",journalHystrixCommand.execute());
        stats.put("publications",publicationHystrixCommand.execute());
        stats.put("datasets",datasetsHystrixCommand.execute());
        stats.put("software",softwareHystrixCommand.execute());
        stats.put("lastYearUsagestats", lastYearUsageStatsHystrixCommand.execute());
        stats.put("usagestats",usageStatsTotalHystrixCommand.execute());
        return stats;
    }
}
