//
//  LoginViewModel.swift
//  AcaMate
//
//  Created by Sean Kim on 12/14/24.
//

import SwiftUI
import Combine


class LoginViewModel: ObservableObject {
    private var cancellables = Set<AnyCancellable>()
    
    @Published var toggleLoading: Bool = false
    @Published var pathName: PathName = .NONE
    
    var bidArray: [String] = []
    
    func loginAction(type: SNSLoginType) {
        LoginController().login(type)
            .flatMap{ snsId in
                loadAPIData(url: "\(API_URL)",
                            path: "/api/v1/in/user/login",
                            parameters: [
                                "acctype": "\(type == .Apple ? "ST00": "ST01")",
                                "sns_id": "\(snsId.snsId)"
                            ],
                            decodingType: APIResponse<User_Token>.self)
                .map { response in
                    return (snsId: snsId.snsId, response: response)
                }
            }
            .sink { [weak self] completion in
                // API 자체적으로 내보내는 에러는 여기서 거를거고
                switch completion {
                case .failure(let error):
                    self?.toggleLoading = false
                    printLog("\(error)")
                case .finished:
                    self?.toggleLoading = false
                }
            } receiveValue: { [weak self] response in
                guard let self = self else { return }
                guard let userToken = response.response as? APIResponse<User_Token> else {return}
                var snsId = response.snsId
                
                switch userToken.status.code {
                case .success(let code):
                    if code == "000" {
                        @UserDefault(key: "token", defaultValue: "accToken") var accToken
                        @UserDefault(key: "refresh", defaultValue: "refreshToken") var refreshToken
                        
                        if let token = userToken.data.toStringDict()["token"],
                           let refresh = userToken.data.toStringDict()["refresh"] {
                            printLog(token)
                            printLog(refresh)
                            accToken = token
                            refreshToken = refresh
                            self.pathName = .SelectAcademy
                            
                        }
                    } else {
                        // 회원가입 진행
                        // 여기다가 타입도 추가해야 함
                        self.pathName = .Register(type, id: "\(snsId)")
                    }
                case .anything(let apiCode):
                    // MARK: TO-DO
                    // 회원가입 로직
                    printLog("\(apiCode) : 로그인 정보 없음")
//                    self.pathName = .Register(type, id: "\(id)")
                default:
                    // 그외에 서버에서 처리를 하다가 문제가 생겨서 발생하는 에러는 여기로 보낼거임
                    printLog("ERROR")
                }
            }
            .store(in: &cancellables)
    }
}
