package com.testapp.service;



import com.mypurecloud.sdk.v2.ApiClient;
import com.mypurecloud.sdk.v2.Configuration;
import com.mypurecloud.sdk.v2.PureCloudRegionHosts;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.springframework.stereotype.Service;
import com.mypurecloud.sdk.v2.api.UsersApi;
import com.mypurecloud.sdk.v2.model.UserMe;
import com.mypurecloud.sdk.v2.model.UserSearchCriteria;
import com.mypurecloud.sdk.v2.model.UserEntityListing;
import com.mypurecloud.sdk.v2.ApiException;
import com.mypurecloud.sdk.v2.model.UserSearchRequest;
import com.mypurecloud.sdk.v2.model.UsersSearchResponse;

@Service
public class GenesysService {
	private String clientId;
	private String clientSecretId;
	
	private void setClientId(String Id) {
		this.clientId = "fbbbdb54-cdfe-4092-836e-503261a68012";
		this.clientSecretId = "-SyBkBPh-L1L1ahb87vQV6mgswZLs1b1jmMONIgzjfk";
	}
	private String getClientId() {
		return this.clientId;
	}
	
	private String getSecretId() {
		return this.clientSecretId;
	}
	
	public void oauthGenesys() {
		this.setClientId("test");
		String clientId = this.getClientId();
		String clientSecret = this.getSecretId();
		
		try {
			ApiClient apiClient = ApiClient.Builder.standard()
					.withBasePath(PureCloudRegionHosts.ap_northeast_2)
					.build();
			
			apiClient.authorizeClientCredentials(clientId, clientSecret);
			Configuration.setDefaultApiClient(apiClient);
			System.out.println("Genesys Cloud 인증 성공");
		} catch (ApiException e) { // SDK 전용 예외 처리
            System.err.println("API 호출 오류: " + e.getMessage());
            throw new RuntimeException("Genesys OAuth 인증 실패: " + e.getMessage(), e);
        } catch (Exception e) {
            throw new RuntimeException("알 수 없는 오류 발생: " + e.getMessage(), e);
        }
	}
	
	public UserMe getUserByEmail(String targetEmail) throws Exception {
        UsersApi usersApi = new UsersApi();

        try {
            // 1. 전체 유저 리스트 요청 (최대 100명씩 가져옴, 실제 운영시 루프 처리 권장)
            // getUsers(pageSize, pageNumber, id, jabberId, email, ...)
            UserEntityListing userListing = usersApi.getUsers(100, 1, null, null, null, null, null, null);
            
            // 2. 리스트에서 이메일이 일치하는 유저 찾기 (Java 8 Stream 사용)
            return userListing.getEntities().stream()
                    .filter(user -> targetEmail.equals(user.getEmail()))
                    .map(user -> {
                        // User 객체를 UserMe 타입으로 변환하거나 필요한 데이터만 추출
                        // 여기서는 단순히 일치하는 첫 번째 유저를 반환 (예제 목적)
                        System.out.println("찾은 유저: " + user.getName() + " (" + user.getId() + ")");
                        return (UserMe) null; // 실제 반환 타입에 맞춰 매핑 필요
                    })
                    .findFirst()
                    .orElseThrow(() -> new RuntimeException("해당 이메일을 가진 유저를 찾을 수 없습니다: " + targetEmail));

        } catch (ApiException e) {
            throw new RuntimeException("유저 리스트 조회 실패: " + e.getMessage(), e);
        }
    }
	
	public String searchUserByEmail(String email) {
		UsersApi apiInstance = new UsersApi();
		UserSearchRequest body = new UserSearchRequest(); // UserSearchRequest | Search request options
        
		// 1. Criteria 생성 (기존과 동일)
		UserSearchCriteria criteria = new UserSearchCriteria();
		criteria.setFields(Collections.singletonList("addresses.email"));
		criteria.setType(UserSearchCriteria.TypeEnum.CONTAINS);
		criteria.setValue(email);

		// 2. 리스트에 담아서 body에 세팅
		List<UserSearchCriteria> queryList = new ArrayList<>();
		queryList.add(criteria);

		body.setQuery(queryList); // addQueryItem 대신 setQuery 사용
        UsersSearchResponse result;
        try {
            // 3. API 호출
            result = apiInstance.postUsersSearch(body);
            
            // 4. 결과에서 이름(name) 추출
            // results 리스트가 비어있지 않은지 확인 필수
            if (result.getResults() != null && !result.getResults().isEmpty()) {
                // 첫 번째 검색 결과의 이름을 가져옴
                String userName = result.getResults().get(0).getName();
                System.out.println("찾은 사용자 이름: " + userName);
                return userName; 
            } else {
                System.out.println("해당 이메일로 검색된 사용자가 없습니다.");
                return null; // 또는 ""
            }

        } catch (ApiException | IOException e) {
            System.err.println("API 호출 중 에러 발생");
            e.printStackTrace();
            return null;
        }
    }
	
	public String loginToGenesys(String email) {
		this.oauthGenesys();
		String username = this.searchUserByEmail(email);
		return username;
		
	}
}