package com.pingcap.syngmail.util;

import cn.authing.core.types.OrgNode;
import com.google.api.services.admin.directory.Directory;
import com.google.api.services.admin.directory.model.Alias;
import com.google.api.services.admin.directory.model.Group;
import com.google.api.services.admin.directory.model.Member;
import com.google.api.services.admin.directory.model.MembersHasMember;
import com.pingcap.syngmail.common.Common;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

/**
 * @author zhuxiaopeng
 * @version 1.0.0
 * @Description 操作google api
 * @createTime 2022年04月12日 22:00:00
 */
@Slf4j
public class GoogleApiUtils {

    private static Logger logger = LoggerFactory.getLogger("sys-user");

    /**
     * @author zhuxiaopeng
     * @description 检查google group是否存在
     */
    public static String checkGroup(String preDepartment, Directory service, String department,String authingId) {
        String mailName = CommonUtils.getDepartmentMail(preDepartment, department);
        boolean tag = false;
        try {
            service.groups().get(mailName).execute();
            log.info("部门" + department + "已经存在");
            tag = true;
        } catch (IOException e) {
            log.error("部门" + department + "不存在");
            log.error(e.toString());
        }
        //如果部门不存在
        if (!tag) {
            mailName = createGroup(service, mailName,department,authingId);
        }
        return mailName;
    }

    /**
     * @author zhuxiaopeng
     * @description 邮件组增加新成员
     */
    public static void addMember(Directory service, String personMail, String groupMail) {
        try {
            service.members().insert(groupMail, new Member().setEmail(personMail)).execute();
            logger.info("将用户" + personMail + "加入" + groupMail);
        } catch (IOException e) {
            log.error("将用户" + personMail + "加入" + groupMail + "失败");
            log.error(e.toString());
        }
    }

    /**
     * @author zhuxiaopeng
     * @description 成员是否在邮件组存在
     */
    public static Boolean isExistsMember(Directory service, String personMail, String groupMail) {
        try {
            MembersHasMember execute = service.members().hasMember(groupMail, personMail).execute();
            if (execute.getIsMember()){
                System.out.println("用户："+personMail+"已经存在"+groupMail);
            }else if (execute.getIsMember()){
                System.out.println("用户："+personMail+"不存在"+groupMail);
            }
            return execute.getIsMember();
        } catch (IOException e) {
            log.error(e.toString());
        }
        return false;
    }

    /**
     * @author zhuxiaopeng
     * @description 删除邮件组中的成员
     */
    public static void deleteMember(Directory service, String personMail, String groupId,String groupMail) {
        try {
            if (!groupId.equals(""))
                service.members().delete(groupId, personMail).execute();
            else
                service.members().delete(groupMail, personMail).execute();
            logger.info("将用户" + personMail + "请离" + groupMail);
        } catch (IOException e) {
            log.error("将用户" + personMail + "请离" + groupMail+"失败");
            log.error(e.toString());
        }
    }

    /**
     * @author zhuxiaopeng
     * @description 创建邮件组
     */
    public static String createGroup(Directory service, String mailName, String departmentName,String authingId) {
        try {
            service.groups().insert(new Group()
                    .setEmail(mailName)
                    .setName("G-"+departmentName)
                    .setDescription(Common.PRE + ":" + authingId)
            ).execute();
            logger.info("创建部门" + departmentName);
        } catch (IOException e) {
            log.error("创建部门" + departmentName + "失败");
            log.error(e.toString());
            return "";
        }
        return mailName;
    }

    /**
     * @author zhuxiaopeng
     * @description 为邮件组起别名
     */
    public static void insertGroupAliases(Directory service, Group group, String aliases) {
        try {
            service.groups().aliases().insert(group.getId(), new Alias().setAlias(aliases)).execute();
            logger.info("部门" + group.getName() + "增加邮箱" + aliases);
        } catch (IOException e) {
            log.info("部门" + group.getName() + "增加邮箱" + aliases + "失败");
            log.error(e.toString());
        }
    }

    /**
     * @author zhuxiaopeng
     * @description 更新邮件组信息
     */
    public static void updateGroupInfo(Directory service, Group group) {
        try {
            service.groups().update(group.getId(), group).execute();
            logger.info("修改部门" + group.getName() + "信息");
        } catch (IOException e) {
            log.info("修改部门" + group.getName() + "信息" + "失败");
            log.error(e.toString());
        }
    }

    public static void deleteGroup(Directory service,Group group){
        try {
            service.groups().delete(group.getId()).execute();
            logger.info("删除部门"+group.getName());
        } catch (IOException e) {
            log.info("删除部门" + group.getName() + "失败");
            log.error(e.toString());
        }
    }
}
