package eu.dnetlib.uoaadmintools.controllers;

import eu.dnetlib.uoaadmintools.dao.CommunityDAO;
import eu.dnetlib.uoaadmintools.dao.CommunitySubscribersDAO;
import eu.dnetlib.uoaadmintools.dao.SubscriberDAO;
import eu.dnetlib.uoaadmintools.entities.Community;
import eu.dnetlib.uoaadmintools.entities.CommunitySubscribers;
import eu.dnetlib.uoaadmintools.entities.Subscriber;
import eu.dnetlib.uoaadmintools.handlers.ContentNotFoundException;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

/**
 * Created by argirok on 2/3/2018.
 */
@RestController
@CrossOrigin(origins = "*")
public class CommunitySubscribersController {
    @Autowired
    CommunitySubscribersDAO communitySubscriberDAO;
    @Autowired
    SubscriberDAO subscriberDAO;
    @Autowired
    CommunityDAO communityDAO;

    private final Logger log = Logger.getLogger(this.getClass());
    @RequestMapping(value = "/community/subscribers", method = RequestMethod.GET)
    public List<CommunitySubscribers> getAllCommunitySubscribers(){
        return communitySubscriberDAO.findAll();
    }
    @RequestMapping(value = "/community/{pid}/subscribers", method = RequestMethod.GET)
    public CommunitySubscribers getSubscribersPerCommunity(@PathVariable(value="pid", required = true) String pid) throws ContentNotFoundException {
        CommunitySubscribers communitySubscribers = communitySubscriberDAO.findByPid(pid);
        if(communitySubscribers != null){
            return communitySubscribers;
        }else{
            throw new ContentNotFoundException("Community Subscribers not found");

        }

    }
    @RequestMapping(value = "/community/{pid}/subscribers", method = RequestMethod.POST)
    public CommunitySubscribers addSubscriberInCommunity(@PathVariable(value="pid", required = true) String pid, @RequestBody Subscriber subscriber) throws ContentNotFoundException {
        CommunitySubscribers communitySubscribers = communitySubscriberDAO.findByPid(pid);
        if(communitySubscribers == null){
            throw new ContentNotFoundException("Community Subscribers not found");
        }

        Subscriber savedSubscriber = subscriberDAO.findByEmail(subscriber.getEmail());
        if(savedSubscriber==null){
            savedSubscriber = subscriberDAO.save(subscriber);
        }
        for(Subscriber sub:communitySubscribers.getSubscribers()){
            if(sub.getEmail().equals(subscriber.getEmail())){
                //already subscribed
                return communitySubscribers;
            }
        }
        //not subscribed yet
        communitySubscribers.getSubscribers().add(savedSubscriber);
        return communitySubscriberDAO.save(communitySubscribers);

    }
    @RequestMapping(value = "/community/{pid}/subscribers/delete", method = RequestMethod.POST)
    public CommunitySubscribers deleteSubscriberFromCommunity(@PathVariable(value="pid", required = true) String pid, @RequestBody List<String> emails) throws ContentNotFoundException {
        CommunitySubscribers communitySubscribers = communitySubscriberDAO.findByPid(pid);
        if(communitySubscribers == null){
            throw new ContentNotFoundException("Community Subscribers not found");
        }
        List<Subscriber> list = new ArrayList<>();
        for(Subscriber s:communitySubscribers.getSubscribers()){
            if(emails.indexOf(s.getEmail())==-1){
             list.add(s);
            }
        }
        communitySubscribers.setSubscribers(list);
        return communitySubscriberDAO.save(communitySubscribers);
    }

    @RequestMapping(value = "/subscriber/communities", method = RequestMethod.GET)
    public List<String> getCommunitiesPerSubcriber(@RequestParam(value="email", required = true) String email) {
        List<CommunitySubscribers> communitySubscribers = communitySubscriberDAO.findAll();
        List<String> list = new ArrayList<>();
        for(CommunitySubscribers s:communitySubscribers){
            for(Subscriber sub:s.getSubscribers()) {
                if (sub.getEmail().equals(email)) {
                    list.add(s.getPid());
                    break;
                }
            }
        }
        return list;
    }
}
