package com.takensoft.cms.mber.vo;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author  : takensoft
 * @since   : 2024.04.01
 * @modification
 *     since    |    author    | description
 *  2024.04.01  |  takensoft   | 최초 등록
 *
 * 회원 정보 관련 VO
 * UserDetails : security 사용을 위해 상속
 * Serializable : 직렬화를 위해 상속
 */

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class MberVO implements UserDetails, Serializable {

    private static final long serialVersionUID = 1L;

    private String mbrId;           // 회원 아이디
    private String lgnId;           // 로그인 아이디
    private String mbrNm;           // 회원 이름
    private String ncnm;            // 닉네임
    private String pswd;            // 비밀번호
    private String mblTelno;        // 휴대폰번호
    private String telno;           // 전화번호
    private String eml;             // 이메일
    private String zip;             // 우편번호
    private String addr;            // 주소
    private String daddr;           // 상세주소
    private String mbrStts;         // 회원상태 0: 탈퇴, 1: 승인, 2: 승인대기, 3: 차단
    private boolean useYn;          // 사용여부
    private String cntrlDt;         // 차단일
    private String cntrlRsn;        // 차단사유
    private String smsRcptnAgreYn;  // 문자수신여부 0: 거부, 1: 허용
    private String emlRcptnAgreYn;  // 이메일수신여부 0: 거부, 1: 허용
    private String prvcRlsYn;       // 개인정보공개여부 0: 거부, 1: 허용
    private String mbrType;         // 회원형태 S: 시스템, K: 카카오, N: 네이버, G: 구글, F: 페이스북
    private String pswdChgDt;       // 비밀번호 변경일
    private String frstRegIp;       // 최초등록 아이피
    private String sysPvsnYn;       // 시스템 제공 여부 -> 시스템에서 제공되는 데이터는 사용자가 제거하지 못하도록 하기 위한 설정값 0: 시스템, 1: 사용자
    private String rgtr;            // 등록자
    private String regDt;           // 등록일
    private String mdfr;            // 수정자
    private String mdfcnDt;         // 수정일
    @JsonIgnore
    private List<MberAuthorVO> authorList = new ArrayList<MberAuthorVO>();  // 권한 정보

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        if(this.authorList.size() > 0) {
            return this.authorList.stream().map(auth -> new SimpleGrantedAuthority(
                    auth.getAuthrtCd()
            )).collect(Collectors.toList());
        } else {
            return null;
        }
    }

    @Override
    public String getPassword() {
        return this.pswd;
    }

    @Override
    public String getUsername() {
        return this.lgnId;
    }

    @Override
    public boolean isAccountNonExpired() {
        return !"0".equals(this.mbrStts);
    }

    @Override
    public boolean isAccountNonLocked() {
        return !"3".equals(this.mbrStts);
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return this.useYn;
    }

    @Override
    public boolean isEnabled() {
        return "1".equals(this.mbrStts);
    }

    // JWT 필터용 생성자
    public MberVO(String mbrId, String lgnId, List<MberAuthorVO> authorList) {
        this.mbrId = mbrId;
        this.lgnId = lgnId;
        this.authorList = authorList;
    }
    // 토큰 재발행용
    public MberVO(String mbrId, String lgnId, String mbrNm, List<MberAuthorVO> authorList) {
        this.mbrId = mbrId;
        this.lgnId = lgnId;
        this.mbrNm = mbrNm;
        this.authorList = authorList;
    }
}
