package pipe.push.service;

import com.google.common.base.Strings;
import pipe.push.bean.api.account.AccountRspModel;
import pipe.push.bean.api.base.ResponseModel;
import pipe.push.bean.api.user.UpdateInfoModel;
import pipe.push.bean.card.UserCard;
import pipe.push.bean.db.User;
import pipe.push.factory.UserFactory;

import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.SecurityContext;
import java.util.List;
import java.util.stream.Collectors;

// 127.0.0.1/api/user/...
@Path("/user")
public class UserService extends BaseService{


    // 用户信息修改接口
    // 返回自己的个人信息
    @PUT
    //@Path("") //127.0.0.1/api/user 不需要写,就是当前目录
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public ResponseModel<UserCard> update(UpdateInfoModel model) {
        if (!UpdateInfoModel.check(model)) {
            return ResponseModel.buildParameterError();
        }

        User self = getSelf();
        // 更新用户信息
        self = model.updateToUser(self);
        self = UserFactory.update(self);
        // 构架自己的用户信息
        UserCard card = new UserCard(self, true);
        // 返回
        return ResponseModel.buildOk(card);
    }

    // 拉去联系人
    @GET
    @Path("/contact")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public ResponseModel<List<UserCard>> contact() {
        User self = getSelf();
        // 拿到我的联系人
        List<User> users = UserFactory.contacts(self);
        // 转换为UserCard
        List<UserCard> userCars = users.stream()
                .map(user -> { // map操作
                    return new UserCard(user, true);
                }).collect(Collectors.toList());
        // 返回
        return ResponseModel.buildOk(userCars);
    }

    // 关注人,双方同时关注
    @PUT // 修改类使用PUT
    @Path("/follow/{followId}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public ResponseModel<UserCard> follow(@PathParam("followId") String followId) {
        User self = getSelf();

        // 不能关注我自己
        if (self.getId().equalsIgnoreCase(followId)
                ||Strings.isNullOrEmpty(followId)) {
            // 返回参数异常
            return ResponseModel.buildParameterError();
        }

        // 找到我要关注的人
        User followUser = UserFactory.findById(followId);
        if (followUser == null) {
            // 返回未找到人
            return ResponseModel.buildNotFoundUserError(null);
        }

        // 默认没有备注
        followUser = UserFactory.follow(self, followUser, null);
        if (followUser==null)
            return ResponseModel.buildServiceError(); // 返回服务器异常

        // TODO 通知我关注的人我关注了他

        // 返回关注的人的信息
        return ResponseModel.buildOk(new UserCard(followUser, true));

    }

    // 获取一个人的信息
    @GET // 修改类使用PUT
    @Path("{id}") // htpp://127.0.0.1/api/user/{id}
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public ResponseModel<UserCard> getUser(@PathParam("id") String id) {
        if (Strings.isNullOrEmpty(id)) {
            return ResponseModel.buildParameterError(); // 参数异常
        }

        User self = getSelf();
        if (self.getId().equalsIgnoreCase(id)) {
            // 返回自己不需要查询
            return ResponseModel.buildOk(new UserCard(self, true));
        }
        User user = UserFactory.findById(id);
        if (user == null) {
            // 没找到返回没找到
            return ResponseModel.buildNotFoundUserError(null);
        }
        // 如果我们直接有关注的记录,则我已经关注需要查询信息的用户
        boolean isFollow = UserFactory.getUserFollow(self, user) != null;
        return ResponseModel.buildOk(new UserCard(user, isFollow));

    }

    // 搜索人的接口
    // 为了简化,值返回20条
    @GET // 搜索人,不涉及数据更改,只是查询
    @Path("/search/{name:(.*)?}") // 名字为任意字符,可以为空
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public ResponseModel<List<UserCard>> search(@DefaultValue("")@PathParam("name") String name) {
        User self = getSelf();
        // 先查询数据
        List<User> searchUsers = UserFactory.search(name);
        // 把查询的人封装为UserCard
        // 判断这些人是否有我已经关注的,
        // 如果有则返回的关注状态中应该已经设置好状态

        // 拿出我的联系人
        final List<User> contacts = UserFactory.contacts(self);

        // 把User转换为UserCard
        List<UserCard> userCards = searchUsers.stream()
                .map(user -> {
                    // 判断这个人是否在我的联系人之中,或者是自己
                    boolean isFollow = user.getId().equalsIgnoreCase(self.getId())
                            // 进行联系人的任意匹配,匹配其中的Id字段
                            || contacts.stream()
                                            .anyMatch(contactUser -> contactUser.getId()
                                                .equalsIgnoreCase(user.getId()));

                    return new UserCard(user, isFollow);
                }).collect(Collectors.toList());
        // 返回
        return ResponseModel.buildOk(userCards);
    }
}