package unitest;

import eu.dnetlib.goldoa.domain.Request;
import eu.dnetlib.goldoa.domain.stats.*;
import eu.dnetlib.goldoa.service.OrganizationManager;
import eu.dnetlib.goldoa.service.stats.StatsManager;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.transaction.Transactional;
import java.util.List;

/**
 * Created by panagiotis on 10/2/2017.
 */
@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration(locations = "classpath:applicationContext-goldoa-service-test.xml")
public class StatisticsTest {

    @Autowired
    StatsManager st;
    @Autowired
    OrganizationManager om;



    @Test
    @Transactional
    @Rollback(true)
    public void browseScientificArea(){
        List<Triple<String, String, Integer>> data = st.browse(new Browse.Category[]{Browse.Category.SCIENTIFIC_AREA})
                .getData(Browse.Category.SCIENTIFIC_AREA);

        for(Triple<String,String,Integer> t:data)
            System.out.println(t.getFirst());
    }

    @Test
    @Transactional
    @Rollback(true)
    public void browseOrganization(){
        List<Triple<String, String, Integer>> data = st.browse(new Browse.Category[]{Browse.Category.ORGANIZATION})
                .getData(Browse.Category.ORGANIZATION);

        for(Triple<String,String,Integer> t:data)
            System.out.println(t.getFirst());
    }

    @Test
    @Transactional
    @Rollback(true)
    public void browsePublisher(){
        List<Triple<String, String, Integer>> data = st.browse(new Browse.Category[]{Browse.Category.PUBLISHER})
                .getData(Browse.Category.PUBLISHER);

        for(Triple<String,String,Integer> t:data)
            System.out.println(t.getFirst());
    }

    @Test
    @Transactional
    @Rollback(true)
    public void browseCountry(){
        List<Triple<String, String, Integer>> data = st.browse(new Browse.Category[]{Browse.Category.COUNTRY})
                .getData(Browse.Category.COUNTRY);

        for(Triple<String,String,Integer> t:data)
            System.out.println(t.getSecond());
    }

    @Test
    @Transactional
    @Rollback(true)
    public void createPieChart(){
        Series publicationTypeDistributionSeries = st.getSeries(new Series.Category[] {Series.Category.STATUS},
                new Request.RequestStatus[] {Request.RequestStatus.CONDITIONALLY_APPROVED, Request.RequestStatus.APPROVED,
                        Request.RequestStatus.ACCOUNTING_PROCESSING, Request.RequestStatus.ACCOUNTING_PAID, Request.RequestStatus.ACCOUNTING_ON_HOLD});

        List<Quadruple<String, Integer, Float, Float>> data = publicationTypeDistributionSeries.getData(Series.Category.STATUS);
        for(Quadruple<String, Integer, Float, Float> t:data)
            System.out.println(t.getFirst()+"/"+t.getSecond());
    }



    @Test
    @Transactional
    @Rollback(true)
    public void infoLabel(){

        Numbers numbers = st.getNumbers(new Numbers.Category[]{Numbers.Category.REQUESTS, Numbers.Category.PROJECTS,
                Numbers.Category.TOTAL_AMOUNT, Numbers.Category.AVERAGE_AMOUNT, Numbers.Category.AVERAGE_PER_ARTICLE,
                Numbers.Category.AVERAGE_PER_MONOGRAPH, Numbers.Category.AVERAGE_PER_BOOK_CHAPTER, Numbers.Category.PAID_REQUESTS,
                Numbers.Category.PAID_REQUESTS_WITH_DOI, Numbers.Category.APPROVED_REQUESTS_WITH_DOI, Numbers.Category.PAID_ARTICLE_REQUESTS,
                Numbers.Category.PAID_MONOGRAPH_REQUESTS, Numbers.Category.PAID_BOOK_CHAPTER_REQUESTS});

       String s1 = st.getNumbers(new Numbers.Category[]{Numbers.Category.REQUESTS}).getNumber(Numbers.Category.REQUESTS) + " publications from " +
                        st.getNumbers(new Numbers.Category[]{Numbers.Category.PROJECTS}).getNumber(Numbers.Category.PROJECTS) + " projects have been approved for funding since 1/1/2015." +
                        "A total of " + st.getNumbers(new Numbers.Category[]{Numbers.Category.TOTAL_AMOUNT}).getNumber(Numbers.Category.TOTAL_AMOUNT) + " EUR has been paid for APCs, with an average of " +
               
                        st.getNumbers(new Numbers.Category[]{Numbers.Category.AVERAGE_AMOUNT}).getNumber(Numbers.Category.AVERAGE_AMOUNT) + "EUR per publication: " +
                        st.getNumbers(new Numbers.Category[]{Numbers.Category.PAID_ARTICLE_REQUESTS}).getNumber(Numbers.Category.PAID_ARTICLE_REQUESTS) + " articles with an average of " +
                        st.getNumbers(new Numbers.Category[]{Numbers.Category.AVERAGE_PER_ARTICLE}).getNumber(Numbers.Category.AVERAGE_PER_ARTICLE) + " EUR " +
                        st.getNumbers(new Numbers.Category[]{Numbers.Category.PAID_MONOGRAPH_REQUESTS}).getNumber(Numbers.Category.PAID_MONOGRAPH_REQUESTS) + " books with an average of " +
                        st.getNumbers(new Numbers.Category[]{Numbers.Category.AVERAGE_PER_MONOGRAPH}).getNumber(Numbers.Category.AVERAGE_PER_MONOGRAPH) + " EUR " +
                        st.getNumbers(new Numbers.Category[]{Numbers.Category.PAID_BOOK_CHAPTER_REQUESTS}).getNumber(Numbers.Category.PAID_BOOK_CHAPTER_REQUESTS) + "book chapters with an average of" +
                        st.getNumbers(new Numbers.Category[]{Numbers.Category.AVERAGE_PER_BOOK_CHAPTER}).getNumber(Numbers.Category.AVERAGE_PER_BOOK_CHAPTER) + " EUR " ;

        String s2 = "Out of " + st.getNumbers(new Numbers.Category[]{Numbers.Category.REQUESTS}).getNumber(Numbers.Category.REQUESTS) +
        " approved requests, " + st.getNumbers(new Numbers.Category[]{Numbers.Category.APPROVED_REQUESTS_WITH_DOI}).getNumber(Numbers.Category.APPROVED_REQUESTS_WITH_DOI) +
        " have a DOI.Out of " + st.getNumbers(new Numbers.Category[]{Numbers.Category.PAID_REQUESTS}).getNumber(Numbers.Category.PAID_REQUESTS) +
        " paid requests, " + st.getNumbers(new Numbers.Category[]{Numbers.Category.PAID_REQUESTS_WITH_DOI}).getNumber(Numbers.Category.PAID_REQUESTS_WITH_DOI)  +
        " have a DOI.";


        System.out.println(s1);
        System.out.println(s2);


    }


    @Test
    @Transactional
    @Rollback(true)
    public void statsData() {

        Numbers rs = st.getNumbers(new Numbers.Category[]{Numbers.Category.REQUESTS, Numbers.Category.PROJECTS,
                Numbers.Category.TOTAL_AMOUNT, Numbers.Category.AVERAGE_AMOUNT, Numbers.Category.AVERAGE_PER_ARTICLE,
                Numbers.Category.AVERAGE_PER_MONOGRAPH, Numbers.Category.AVERAGE_PER_BOOK_CHAPTER, Numbers.Category.PAID_REQUESTS,
                Numbers.Category.PAID_REQUESTS_WITH_DOI, Numbers.Category.APPROVED_REQUESTS_WITH_DOI, Numbers.Category.PAID_ARTICLE_REQUESTS,
                Numbers.Category.PAID_MONOGRAPH_REQUESTS, Numbers.Category.PAID_BOOK_CHAPTER_REQUESTS});

        Series fundedRequests = st.getSeries(new Series.Category[] {Series.Category.COUNTRY, Series.Category.ORGANIZATION,
                Series.Category.PUBLISHER}, new Request.RequestStatus[] {Request.RequestStatus.CONDITIONALLY_APPROVED,
                Request.RequestStatus.APPROVED, Request.RequestStatus.ACCOUNTING_PROCESSING, Request.RequestStatus.ACCOUNTING_PAID,
                Request.RequestStatus.ACCOUNTING_ON_HOLD});
        Series rejectedRequests = st.getSeries(new Series.Category[] {Series.Category.COUNTRY, Series.Category.ORGANIZATION,
                Series.Category.PUBLISHER}, new Request.RequestStatus[] {Request.RequestStatus.REJECTED,
                Request.RequestStatus.ACCOUNTING_DENIED});

        DateSeries result = st.getDateSeries(DateSeries.Over.DAY, false, null, null, null, null, null, null);
        result = st.getDateSeries(DateSeries.Over.DAY, true,null, null, null, null, null, null);

        st.getSeries(new Series.Category[] {Series.Category.STATUS}, null);
        st.browse(new Browse.Category[] {Browse.Category.COUNTRY, Browse.Category.ORGANIZATION,
                Browse.Category.PUBLISHER, Browse.Category.SCIENTIFIC_AREA});
    }







}