package com.jty.wsxt.infrastructure.security;

import com.jty.wsxt.application.service.AuthAuthorityService;
import com.jty.wsxt.domain.model.auth.user.AuthUser;
import com.jty.wsxt.domain.model.auth.user.UserRepository;
import com.jty.wsxt.infrastructure.support.BusinessException;
import com.jty.wsxt.infrastructure.support.ResultCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class MyUserDetailService implements UserDetailsService {

    private final UserRepository userRepository;

    @Autowired
    private AuthAuthorityService authAuthorityService;

    @Autowired
    public MyUserDetailService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    /**
     * 根据配置信息确认是否需要查找用户相应学校
     * 如果需要,根据学校信息生成用户的有效期等内容
     *
     * @param username
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    @Transactional
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Pattern p = Pattern.compile("^[1][0-9]{10}$"); // 验证手机号
        Matcher m = p.matcher(username);
        Boolean isMobile = m.matches();
        AuthUser user;
        MyUserDetail detail = new MyUserDetail();
        if (isMobile) {
            user = userRepository.findByMobile(username).orElseThrow(() -> new BusinessException(ResultCode.USER_LOGIN_ERROR));
            detail.setUsername(user.getMobile());
        } else {
            user = userRepository.findByAccount(username).orElseThrow(() -> new BusinessException(ResultCode.USER_LOGIN_ERROR));
            detail.setUsername(user.getAccount());
        }
        detail.setUserId(user.getId());
        detail.setRealName(user.getRealName());
        detail.setPassword(user.getPassword());
        detail.setEnabled(user.getEnabled());
        detail.setAuthorities(authAuthorityService.getAuthority(user.getId()));
        return detail;
    }

}