package com.pingcap.syngmail.thread;

import cn.authing.core.graphql.GraphQLException;
import cn.authing.core.mgmt.ManagementClient;
import cn.authing.core.types.Node;
import com.google.api.services.admin.directory.Directory;
import com.google.api.services.admin.directory.model.Group;
import com.google.api.services.admin.directory.model.Groups;
import com.mysql.cj.util.StringUtils;
import com.pingcap.syngmail.common.Common;
import com.pingcap.syngmail.util.GoogleApiUtils;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.Callable;

/**
 * @author zhuxiaopeng
 * @version 1.0.0
 * @Description 部门比对，删除不存在的部门
 * @createTime 2022年04月20日 17:51:00
 */
public class DepartmentCompare implements Callable {

    private ManagementClient client;

    private Directory service;

    public DepartmentCompare(ManagementClient client, Directory service) {
        this.client = client;
        this.service = service;
    }

    @Override
    public Object call() throws Exception {
        try {
            Groups execute = service.groups().list().setCustomer("my_customer").execute();
            String tmpGroup = "";
            while (true) {
                List<Group> groups = execute.getGroups();
                String firstGroup = groups.get(0).getName();
                if (!StringUtils.isNullOrEmpty(tmpGroup) && tmpGroup.equals(firstGroup)) {
                    break;
                }

                try {
                    for (com.google.api.services.admin.directory.model.Group group : groups) {
//                        if (group.getName().startsWith(Common.DELETE) || group.getName().startsWith(Common.RENAME)) {
//                            continue;
//                        }
                        if (group.getDescription().startsWith(Common.PRE + ":")) {
                            String id = group.getDescription().replaceFirst(Common.PRE + ":", "");
                            Node execute1 = client.org().findNodeById(id).execute();
                            //authing中不存在，google中设置为不可用
                            if (execute1 == null) {
                                group.setName(Common.DELETE + group.getName());
                                GoogleApiUtils.updateGroupInfo(service, group);
                                continue;
                            }

                            String authingGroupName = execute1.getName().toLowerCase();
                            String groupName = group.getName().replace("G-", "").toLowerCase();

                            if (!authingGroupName.equals(groupName)) {
                                group.setName(Common.RENAME + group.getName());
                                //更新邮件组名字
                                GoogleApiUtils.updateGroupInfo(service, group);
                            }
                        }
                    }
                } catch (GraphQLException e) {
                    e.printStackTrace();
                }
                if (StringUtils.isNullOrEmpty(tmpGroup)) {
                    tmpGroup = firstGroup;
                }
                execute = service.groups().list().setCustomer("my_customer").setPageToken(execute.getNextPageToken()).execute();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
