package com.fr.startup.ui;

import com.fr.design.DesignerEnvManager;
import com.fr.design.env.DesignerWorkspaceInfo;
import com.fr.design.env.DesignerWorkspaceType;
import com.fr.stable.StringUtils;
import com.fr.third.guava.collect.Lists;
import com.fr.workspace.connect.WorkspaceConnectionInfo;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * created by Harrison on 2022/07/06
 **/
public class StartupPageModel {
    
    private StartupWorkspaceBean selectWorkspaceInfo;
    
    private List<StartupWorkspaceBean> workspaceInfos = new ArrayList<>();
    
    private Map<String, List<String>> recentFilesMap = new HashMap<>();
    
    private Runnable openLastTemplateRunnable;
    
    private Runnable createNewTemplateRunnable;
    
    private Runnable openEmptyTemplateRunnable;
    
    public static StartupPageModel create() {
    
        DesignerEnvManager envManager = DesignerEnvManager.getEnvManager();
        String curEnvName = envManager.getCurEnvName();
        Iterator<String> envNameIterator = envManager.getEnvNameIterator();
    
        Comparator<StartupWorkspaceBean> startupWorkspaceBeanComparator = convertComparator(curEnvName);
        List<StartupWorkspaceBean> infos = Lists.newArrayList(envNameIterator)
                .stream()
                .map((e) -> {
                    DesignerWorkspaceInfo workspaceInfo = envManager.getWorkspaceInfo(e);
                    if (workspaceInfo.getType() == DesignerWorkspaceType.Remote) {
                        WorkspaceConnectionInfo connection = workspaceInfo.getConnection();
                        String remoteAddress = StartupPageUtil.getRemoteAddress(connection.getUrl());
                        return new StartupWorkspaceBean(e, remoteAddress, workspaceInfo.getType());
                    } else {
                        return new StartupWorkspaceBean(e, workspaceInfo.getPath(), workspaceInfo.getType());
                    }
                })
                .sorted(startupWorkspaceBeanComparator)
                .collect(Collectors.toList());
        Map<String, List<String>> recentFileMap = new HashMap<>();
        for (StartupWorkspaceBean info : infos) {
            String name = info.getName();
            List<String> recentFiles = envManager.getRecentOpenedFilePathList4Env(name);
            recentFileMap.put(name, recentFiles);
        }
        return new StartupPageModel(infos, recentFileMap);
    }
    
    public StartupPageModel(List<StartupWorkspaceBean> workspaceInfos, Map<String, List<String>> recentFilesMap) {
        this.selectWorkspaceInfo = workspaceInfos.get(0);
        this.workspaceInfos = workspaceInfos;
        this.recentFilesMap = recentFilesMap;
    }
    
    public StartupWorkspaceBean getSelectWorkspaceInfo() {
        return selectWorkspaceInfo;
    }
    
    public void setSelectWorkspaceInfo(StartupWorkspaceBean selectWorkspaceInfo) {
        this.selectWorkspaceInfo = selectWorkspaceInfo;
    }
    
    public List<StartupWorkspaceBean> getWorkspaceInfos() {
        return workspaceInfos;
    }
    
    public void setWorkspaceInfos(List<StartupWorkspaceBean> workspaceInfos) {
        this.workspaceInfos = workspaceInfos;
    }
    
    public Map<String, List<String>> getRecentFilesMap() {
        return recentFilesMap;
    }
    
    public void setRecentFilesMap(Map<String, List<String>> recentFilesMap) {
        this.recentFilesMap = recentFilesMap;
    }
    
    public Runnable getOpenLastTemplateRunnable() {
        return openLastTemplateRunnable;
    }
    
    public void setOpenLastTemplateRunnable(Runnable openLastTemplateRunnable) {
        this.openLastTemplateRunnable = openLastTemplateRunnable;
    }
    
    public Runnable getCreateNewTemplateRunnable() {
        return createNewTemplateRunnable;
    }
    
    public void setCreateNewTemplateRunnable(Runnable createNewTemplateRunnable) {
        this.createNewTemplateRunnable = createNewTemplateRunnable;
    }
    
    public Runnable getOpenEmptyTemplateRunnable() {
        return openEmptyTemplateRunnable;
    }
    
    public void setOpenEmptyTemplateRunnable(Runnable openEmptyTemplateRunnable) {
        this.openEmptyTemplateRunnable = openEmptyTemplateRunnable;
    }
    
    private static Comparator<StartupWorkspaceBean> convertComparator(String curEnvName) {
    
        return (o1, o2) -> {
            if (StringUtils.equals(curEnvName, o1.getName())) {
                return -1;
            }
            if (StringUtils.equals(curEnvName, o2.getName())) {
                return 1;
            }
            return 0;
        };
    }
}