package eu.dnetlib.recolecta.extended.ui;

import eu.dnetlib.enabling.locators.UniqueServiceLocator;
import eu.dnetlib.rmi.enabling.ISLookUpService;
import eu.dnetlib.rmi.enabling.ISRegistryService;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by miriam on 25/07/2018.
 */
@RestController
public class UserManagerRestController {

    @Autowired
    private UniqueServiceLocator serviceLocator;

    private static final Log log = LogFactory.getLog(UserManagerRestController.class);

    @RequestMapping(value = "/ui/usermanager/load.do")
    public List<User> updateProfile() throws Exception {

        List<String> userProfiles = serviceLocator.getService(ISLookUpService.class).quickSearchProfile("for $x in collection('/db/DRIVER/UserDSResources/UserDSResourceType') return $x");

        List<User> users = new ArrayList<>();

        for (String profile: userProfiles){
            try {
                users.add(createUser(profile));
            } catch (Exception e) {
            }
        }

        return users;
    }

    private User createUser(String profile) throws Exception {

        final Document doc = new SAXReader().read(new StringReader(profile));

        String email = doc.valueOf("//EMAIL/@value");
        String firstname = doc.valueOf("//FIRST_NAME/@value");
        String lastname = doc.valueOf("//LAST_NAME/@value");
        String profID = doc.valueOf("//RESOURCE_IDENTIFIER/@value");

        return new User(email, firstname, lastname, profID);

    }

    @RequestMapping(value = "/ui/usermanager/securityprofile.do")
    public List<String> getSecurityProfID(@RequestBody List<String> fullProfID) throws Exception {

        return serviceLocator.getService(ISLookUpService.class).quickSearchProfile("for $x in collection('/db/DRIVER/SecurityProfileDSResources/SecurityProfileDSResourceType') where $x//resourceId/text()='"+ fullProfID.get(0) +"' return $x//RESOURCE_IDENTIFIER/@value/string()");

    }

    @RequestMapping(value = "/ui/usermanager/userroles.do")
    public List<String> getUserRoles(@RequestBody List<String> securityProfID) throws Exception {

        return serviceLocator.getService(ISLookUpService.class).quickSearchProfile("for $x in collection('/db/DRIVER/SecurityProfileDSResources/SecurityProfileDSResourceType')  where  $x//RESOURCE_IDENTIFIER[@value='"+securityProfID.get(0)+"'] return $x//identities[./type/text()='driver.security.identity.role']/text/text()");

    }

    @RequestMapping(value = "/ui/usermanager/removerole.do")
    public void removeUserRole(@RequestBody List<String> params) throws Exception {

        final String securityProfID = params.get(0);
        final String role = params.get(1);

        String securityProfile = serviceLocator.getService(ISLookUpService.class).quickSearchProfile("for $x in collection('/db/DRIVER/SecurityProfileDSResources/SecurityProfileDSResourceType')  where  $x//RESOURCE_IDENTIFIER[@value='" + securityProfID + "'] return $x").get(0);

        final Document doc = new SAXReader().read(new StringReader(securityProfile));

        Node node = doc.selectSingleNode("//identities[./text='"+role+"']");
        node.detach();

        serviceLocator.getService(ISRegistryService.class).updateProfile(securityProfID, doc.asXML(), doc.valueOf("//RESOURCE_TYPE/@value"));
    }


    @RequestMapping(value = "/ui/usermanager/addrole.do")
    public void addUserRole(@RequestBody List<String> params) throws Exception {

        final String securityProfID = params.get(0);
        final String roleCombo = params.get(1);
        final String roleText = params.get(2);
        final String PREF = "driver.security.identity.role";
        String securityProfile = serviceLocator.getService(ISLookUpService.class).quickSearchProfile("for $x in collection('/db/DRIVER/SecurityProfileDSResources/SecurityProfileDSResourceType')  where  $x//RESOURCE_IDENTIFIER[@value='" + securityProfID + "'] return $x").get(0);

        String role;
        if (StringUtils.isNotBlank(roleCombo)){
            if (StringUtils.isNotBlank(roleText))
                role = roleCombo + "," + roleText;
            else
                role = roleCombo;
        }
        else
            role = roleText;

        if (!securityProfile.contains(">"+role+"<")){
            final Document doc = new SAXReader().read(new StringReader(securityProfile));



            Node node = doc.selectSingleNode("//CONFIGURATION");
            Element conf = (Element) node;
            Element id = conf.addElement("identities");


            id.addElement("text").setText(role);

            id.addElement("type").setText(PREF);

            serviceLocator.getService(ISRegistryService.class).updateProfile(securityProfID, doc.asXML(), doc.valueOf("//RESOURCE_TYPE/@value"));
        }

    }



}