package eu.dnetlib.usagestats.services;

import eu.dnetlib.usagestats.portal.TotalStats;
import eu.dnetlib.usagestats.portal.UsageStats;
import eu.dnetlib.usagestats.repositories.UsageStatsRepository;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class UsageStatsServiceImpl implements UsageStatsService{

    private final UsageStatsRepository usageStatsRepository;

    public UsageStatsServiceImpl(UsageStatsRepository usageStatsRepository) {
        this.usageStatsRepository = usageStatsRepository;
    }

    @Override
    public UsageStats getDatasourceClicks(String id) {
        String query = "SELECT 'views', sum(s.count), sum(s.openaire) FROM views_stats s where s.repository_id=? " +
                "UNION ALL SELECT 'downloads', sum(s.count), sum(s.openaire) FROM downloads_stats s where s.repository_id=? " +
                "UNION ALL SELECT 'pageviews', sum(s.count), '0' FROM pageviews_stats s, result_datasources rd where rd.id=s.result_id and rd.datasource=? ";

        List<String> values = new ArrayList<>();
        values.add(id);
        values.add(id);
        values.add(id);

        return usageStatsRepository.executeUsageStats(query, values, "datasource");
    }

    /*
    @Override
    public UsageStats getOrganizationClicks(String organizationId) {

        String query = "select sum(number_of_views) from organization_stats where id=?";

        List<String> values = new ArrayList<>();
        values.add(organizationId);

        return usageStatsRepository.executeUsageStats(query, values, "organization");

    }
    */

    @Override
    public UsageStats getProjectClicks(String projectId) {
        String query = "SELECT 'views', sum(s.count), sum(s.openaire) FROM views_stats s, project_results pr where pr.result=s.result_id and pr.id=? " +
                "UNION ALL SELECT 'downloads', sum(s.count), sum(s.openaire) FROM downloads_stats s, project_results pr where pr.result=s.result_id and pr.id=? " +
                "UNION ALL SELECT 'pageviews', sum(s.count), '0' FROM pageviews_stats s, project_results pr where pr.result=s.result_id and pr.id=?;";

        List<String> values = new ArrayList<>();
        values.add(projectId);
        values.add(projectId);
        values.add(projectId);

        return usageStatsRepository.executeUsageStats(query, values, "project");
    }

    @Override
    public UsageStats getResultClicks(String id) {
        String query = "SELECT 'views', s.repository_id, CASE WHEN s.source='OpenAIRE' THEN d.name ELSE d.name ||' - '|| s.source END, sum(count), sum(openaire) FROM views_stats s, datasource d WHERE s.repository_id=d.id AND s.result_id=? GROUP BY s.source, s.repository_id, d.name " +
                "UNION ALL SELECT 'downloads', s.repository_id, CASE WHEN s.source='OpenAIRE' THEN d.name ELSE d.name ||' - '|| s.source END, sum(count), sum(s.openaire) FROM downloads_stats s, datasource d WHERE s.repository_id=d.id AND s.result_id=? GROUP BY s.source, s.repository_id, d.name " +
                "UNION ALL SELECT 'pageviews', 'OpenAIRE id', 'OpenAIRE', sum(count), '0' FROM pageviews_stats s WHERE result_id=?;";

        List<String> values = new ArrayList<>();
        values.add(id);
        values.add(id);
        values.add(id);

        return usageStatsRepository.executeUsageStats(query, values, "result");
    }

    @Override
    public TotalStats getTotalStats() {
        return usageStatsRepository.executeTotalStats();
    }
}
