/**
******************************************************************************
* Copyright © 2017-2018 PTA GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* 
*     http://www.eclipse.org/legal/epl-v10.html
* 
******************************************************************************
*/
package org.eclipse.openk.elogbook.controller;


import com.google.gson.reflect.TypeToken;
import org.apache.log4j.Logger;
import org.eclipse.openk.elogbook.common.BackendConfig;
import org.eclipse.openk.elogbook.common.JsonGeneratorBase;
import org.eclipse.openk.elogbook.communication.RestServiceWrapper;
import org.eclipse.openk.elogbook.exceptions.BtbException;
import org.eclipse.openk.elogbook.persistence.dao.AutoCloseEntityManager;
import org.eclipse.openk.elogbook.persistence.dao.EntityHelper;
import org.eclipse.openk.elogbook.persistence.dao.TblNotificationDao;
import org.eclipse.openk.elogbook.viewmodel.contactbasedata.AssignmentModulContactDto;
import org.eclipse.openk.elogbook.viewmodel.contactbasedata.ContactTupel;
import org.eclipse.openk.elogbook.viewmodel.contactbasedata.VwDetailedContact;
import org.eclipse.openk.elogbook.viewmodel.contactbasedata.VwDetailedContactPage;

import javax.persistence.EntityManager;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;

public class ContactBaseDataManager {
    private static final Logger LOGGER = Logger.getLogger(ContactBaseDataManager.class.getName());


    private static final ContactBaseDataManager INSTANCE = new ContactBaseDataManager();

    private ContactBaseDataManager() {
    }

    public static ContactBaseDataManager getInstance() {
        return INSTANCE;
    }

    public List<ContactTupel> getUserContacts(String token) throws BtbException {
        RestServiceWrapper restServiceWrapper = new RestServiceWrapper(BackendConfig.getInstance().getContactBaseDataApiUrl(), false);
        String response = restServiceWrapper.performGetRequest("contacts?size=2000",token);
        VwDetailedContactPage vwDetailedContactPage = JsonGeneratorBase.getGson().fromJson(response,
                VwDetailedContactPage.class);
        return vwDetailedContactPage.getContent().stream().map(this::mapFromViewObj ).collect(Collectors.toList());
    }

    public List<AssignmentModulContactDto> getAssignedModulsForContact(String token, UUID contactUuid) throws BtbException {
        RestServiceWrapper restServiceWrapper = new RestServiceWrapper(BackendConfig.getInstance().getContactBaseDataApiUrl(), false);
        String response = restServiceWrapper.performGetRequest("contacts/"+contactUuid+"/assignments",token);
        return JsonGeneratorBase.getGson().fromJson(response
                , new TypeToken<List<AssignmentModulContactDto>>() {}.getType());
    }

    public void postAssignedModulsForContact(String token, UUID contactUuid) throws BtbException {
        AssignmentModulContactDto modulContactDto = new AssignmentModulContactDto();
        modulContactDto.setContactId(contactUuid);
        modulContactDto.setModulName(BackendConfig.getInstance().getElogbookModuleName());
        String data = JsonGeneratorBase.getGson().toJson(modulContactDto);
        RestServiceWrapper restServiceWrapper = new RestServiceWrapper(BackendConfig.getInstance().getContactBaseDataApiUrl(), false);
        restServiceWrapper.performPostRequest("contacts/"+contactUuid+"/assignments", token, data);
    }

    public void synchronizeContacts(String token) {
        LOGGER.debug("synchronizeContacts is called");
        EntityManager emOrg = EntityHelper.getEMF().createEntityManager();
        try (AutoCloseEntityManager em = new AutoCloseEntityManager(emOrg)) {
            em.getTransaction().begin();
            TblNotificationDao notifDao = new TblNotificationDao(em);
            Map<UUID, String> uuid2NameMap = getUserContacts(token).stream().collect(Collectors.toMap(ContactTupel::getContactUuid, ContactTupel::getContactName));
            notifDao.getDistinctResponsibilityForwardingUuid()
                        .forEach( contactUuid -> notifDao.updateResponsibilityForwardingByContactUuid( contactUuid, uuid2NameMap.getOrDefault(contactUuid, "/gelöscht/")));
            em.getTransaction().commit();

        } catch (BtbException btbException) {
            LOGGER.error("error in synchronizeContacts", btbException);
        } finally {
            LOGGER.debug("synchronizeContacts is finished");
        }
    }


    private ContactTupel mapFromViewObj( VwDetailedContact vwDetailedContact ) {
        String userName = vwDetailedContact.getName();
        if (userName != null) {
            userName = userName.replace("," ,"");
        }
        ContactTupel ct = new ContactTupel();
        ct.setContactName(userName);
        ct.setContactUuid(vwDetailedContact.getUuid());
        return ct;

    }

}
