//
//  NavigationView.swift
//  AcaMate
//
//  Created by Sean Kim on 12/12/24.
//

import SwiftUI
import Combine


/// 이거 위에 다른 뷰들이 위젯 느낌으로 계속 갈아 끼워지는거
struct NavigationView: View {
    @EnvironmentObject var appVM: AppViewModel
    @State private var naviState : NaviState = .init(act: .NONE, path: .Intro)
    @State private var history: [PathName] = [.Intro]
    
    var body: some View {
        VStack(spacing: 0) {
            
            ZStack {
                switch naviState.path {
                case .NONE:
                    EmptyView()
                case .Intro:
                    IntroView(naviState: $naviState)
                case .Login :
                    LoginView(naviState: $naviState)
                case .Main:
                    MainView(naviState: $naviState)
                }
            }
        }
        .onChange(of: naviState) { old, new in
            switch new.act {
            case .NONE:
                break
            case .ADD:
                addHistory(path: new.path)
            case .POP:
                popHistory()
            case .RESET:
                resetHistory(path: new.path)
            case .MOVE:
                moveHistory(path: new.path)
            }
            printLog("\(old.path) => \(new.path)")
            showHistory()
        }
        .onTapGesture {
            endTextEditing()
        }
        .fullDrawView(.Normal.normal)
        .setAlert()
        .setNetwork()
        .loadingView(isLoading: $appVM.isLoading)
    }
    
    /// 경로에 한 단계 추가
    private func addHistory(path: PathName) {
        history.append(path)
    }
    
    /// 가장 가까운 경로 삭제
    private func popHistory() {
        history.removeLast()
        naviState.set(act: .NONE, path: history.last ?? .NONE)
    }
    
    /// 경로 기록 전체 삭제
    private func resetHistory(path: PathName) {
        history.removeAll()
        addHistory(path: path)
    }
    
    /// 경로의 최상단 지우고, 새로 이동하는 경로로 설정
    private func moveHistory(path: PathName) {
        if path == .NONE {
            naviState.set(act: .RESET, path: history.first ?? .Main)
        }
        if history.contains(path) {
            let remove = history.count - history.firstIndex(of: path)! - 1
            history.removeLast(remove)
            if remove > 0 {
                naviState.set(act: .NONE, path: path)
                return
            }
        }
        naviState.set(act: .RESET, path: path)
    }
    
    private func showHistory() {
        printLog(history)
    }
    
}
