package unitest;

import eu.dnetlib.goldoa.domain.*;
import eu.dnetlib.goldoa.service.*;
import eu.dnetlib.goldoa.service.dao.UserDAO;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.PropertySource;
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.io.IOException;
import java.util.List;

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

    @Autowired
    UserManagerImpl um;
    @Autowired
    OrganizationManager om;
    @Autowired
    ProjectManager pm;
    @Autowired
    SearchManager sm;
    @Autowired
    PublisherManager pubm;
    @Autowired
    HelpManager hm;

    @Autowired
    ProjectManagerImpl p;

    @Autowired
    UserDAO ud;

    @Autowired
    EligibilityManager em;

    @Test
    @Transactional
    @Rollback(true)
    public void login(){
        User user = null;
        try {
            user = um.login("pkanakakis@di.uoa.gr","1234");
        } catch (PersonManagerException e) {
            e.printStackTrace();
        }
    }


    @Test
    @Transactional
    @Rollback(true)
    public void register() throws IOException, PersonManagerException {
        User user = new User();
        user.setEmail("pgl@otenet.gr");
        user.setPassword("1234");
        List<Object> rs = null;


        rs = sm.search(SearchManager.TYPE.PUBLISHER,"EDP Sciencesss");
        Publisher pub = null;
        if(rs.size() > 0)
           pub  = (Publisher)rs.get(0);

        if(pub == null){
            pub = new Publisher();
            pub.setName("EDP");

            user.setPublisher(pub);

            pub.getContacts().add(user);
            pubm.savePublisher(pub);

            try {
                um.register(user);
            } catch (PersonManagerException e) {
                e.printStackTrace();
            }
        }else{
            user.setPublisher(pub);

            try {
                um.register(user);
            } catch (PersonManagerException e) {
                e.printStackTrace();
            }

            pub.getContacts().add(user);
            pubm.savePublisher(pub);
        }


    }


    @Test
    @Transactional
    @Rollback(true)
    public void eligibleProjectsByOrganization(){
        List<Project> pr = pm.getEligibleProjectsForOrganization("corda::983580389");
        for(Project p : pr)
            System.out.println(p.getId());

        pr = pm.getFutureEligibleProjectsForOrganization("corda::983580389");
        for(Project p : pr)
            System.out.println(p.getId());
    }

    @Test
    @Transactional
    @Rollback(true)
    public void getModerators(){
        List<User> users = um.getModerators();
        for(User u:users)
            System.out.println(u.getEmail());
    }

    @Test
    @Transactional
    @Rollback(true)
    public void resetPassword(){
        try {
            um.resetPassword("ant.lebesis@gmail.com");
        } catch (PersonManagerException e) {
            e.printStackTrace();
        }
    }

    @Test
    @Transactional
    @Rollback(true)
    public void getPublisherContacts(){
        List<Object> rs = null;

        rs = sm.search(SearchManager.TYPE.PUBLISHER,"EDP Sciences");
        Publisher pub = null;
        pub  = (Publisher)rs.get(0);

        for(User contact:pub.getContacts())
            System.out.println(contact.getEmail());

    }

    @Test
    @Transactional
    @Rollback(true)
    public void registerAsPC() throws IOException, PersonManagerException {
        User user = new User();
        user.setEmail("p4@di.uoa.gr");
        user.setPassword("1234");
        List<Object> rs = null;

        rs = sm.search(SearchManager.TYPE.PROJECT,"ECB");
        user.getCoordinatedProjects().add((Project)rs.get(0));
        um.saveUser(user);

    }


    @Test
    @Transactional
    @Rollback(true)
    public void activateUserToken() throws IOException, PersonManagerException {
        um.activate("gwen.franck@kb.nl","ac70787e-34e9-4daa-9e5e-96c48716c07c");
    }


    @Test
    @Transactional
    @Rollback(true)
    public void search() throws IOException, PersonManagerException {
        List<Object> rs = sm.search(SearchManager.TYPE.PROJECT, "WIMCAM");
        Project p = ((Project)rs.get(0));
        System.out.println(p.getTitle() + "/" + p.getEnddate() + "/" + p.getStartdate());

        Request r = new Request();
        r.setProject(p);
        r.setStatus(Request.RequestStatus.INCOMPLETE);
        Eligibility e = em.validate(r);
        System.out.println("Eligibility status: " + e.getStatus());

        /*String contents = "";
        for(String message : e.getMessages())
            contents +=  message;
        System.out.println(contents);*/
    }

    @Test
    @Transactional
    @Rollback(true)
    public void getHelp(){
        System.out.println(hm.getById("register").getText());
    }

    @Test
    @Transactional
    @Rollback(true)
    public void getRoles(){
        List<Role> roles = um.getRoles();
        for(Role r:roles)
            System.out.println(r.getId() +"/" + r.getRole());
    }


}