package com.icomsys.main_vm.biz.common.login.service;

import com.google.gson.Gson;
import com.icomsys.main_vm.db.jpa.entity.system.TbBotUser;
import com.icomsys.main_vm.db.jpa.repo.system.TbBotUserRepo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
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 java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Service
@Slf4j
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {

    private final TbBotUserRepo tbBotUserRepo;

    //솔루션이 다르고 아이디가 같은경우 서비스 로직에서 솔루션 구별후 로그인 시행
    //기본적으로 솔루션 상관없이 아이디 안겹치게해주는게 좋을듯.
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        UserDetails a = tbBotUserRepo.findByUserIdAndUseYn(username, "Y")
                .map(this::createUserDetail)
                .orElseThrow(() -> new UsernameNotFoundException(username + " -> 데이터베이스에서 찾을 수 없습니다."));
        return a;
    }

    //시큐리티에 올려놓고 검사하는경우. 동적처리가 안되서 제외시켜야할듯.
    //권한 수정시 즉시반영이 SOE 시나몬 솔루션 정책이라고함.
    //로그인 용도로만 사용해야할듯.
    //나중엔 정책으로 변경.
    private UserDetails createUserDetail(TbBotUser dto) {
        //시스템 전체관리자인경우 권한이 여러개일수 있어 리스트로 구현
        List<String> authList = new ArrayList<>();
        authList.add(dto.getRoleVal());
        log.info("authList - {}", new Gson().toJson(authList));
        List<SimpleGrantedAuthority> permission = authList.stream()
                .map(SimpleGrantedAuthority::new)
                .collect(Collectors.toList());
        return new User(String.valueOf(dto.getUserId()), dto.getPassword(), permission);
    }


}
