//
//  SplashView.swift
//  SodaLive
//
//  Created by klaus on 2023/08/09.
//

import SwiftUI
import FirebaseRemoteConfig

struct SplashView: View {
    
    @State private var isShowForcedUpdatePopup = false
    @State private var isShowUpdatePopup = false
    
    @StateObject var liveViewModel = LiveViewModel()
    
    var body: some View {
        ZStack(alignment: .top) {
            Image("splash_christmas_bg")
                .resizable()
                .aspectRatio(contentMode: .fill)
                .edgesIgnoringSafeArea(.all)
            
            Image("splash_logo_christmas")
                .padding(.top, 188)
            
        }
        .onAppear {
            fetchLastestVersion()
        }
    }
    
    private func fetchLastestVersion() {
        let remoteConfig = RemoteConfig.remoteConfig()
        let configSettings = RemoteConfigSettings()
        configSettings.minimumFetchInterval = 300
        remoteConfig.configSettings = configSettings
        
        remoteConfig.fetch { status, error in
            if status == .success {
                remoteConfig.activate { changed, error in
                    checkAppVersion(latestVersion: remoteConfig["ios_latest_version"].stringValue)
                }
            } else {
                DispatchQueue.main.asyncAfter(deadline: .now() + 2.5) {
                    withAnimation {
                        if AppState.shared.pushRoomId > 0 {
                            liveViewModel.enterLiveRoom(roomId: AppState.shared.pushRoomId)
                        } else if AppState.shared.pushChannelId > 0 {
                            AppState.shared.setAppStep(step: .creatorDetail(userId: AppState.shared.pushChannelId))
                        } else if AppState.shared.pushAudioContentId > 0 {
                            AppState.shared.setAppStep(step: .contentDetail(contentId: AppState.shared.pushAudioContentId))
                        } else {
                            AppState.shared.setAppStep(step: .main)
                        }
                    }
                }
            }
        }
    }
    
    private func checkAppVersion(latestVersion: String?) {
        let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String
        
        if let latestVersion = latestVersion, let version = version {
            let latestVersions = latestVersion.split(separator: ".")
            let versions = version.split(separator: ".")
            
            let latestMajor = Int(latestVersions[0])!
            let latestMinor = Int(latestVersions[1])!
            let latestPatch = Int(latestVersions[2])!
            
            let major = Int(versions[0])!
            let minor = Int(versions[1])!
            let patch = Int(versions[2])!
            
            if latestMajor > major || (latestMajor == major && latestMinor > minor) {
                self.isShowForcedUpdatePopup = true
            } else if latestMajor == major && latestMinor == minor && latestPatch > patch {
                self.isShowUpdatePopup = true
            } else {
                DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                    withAnimation {
                        if AppState.shared.pushRoomId > 0 {
                            liveViewModel.enterLiveRoom(roomId: AppState.shared.pushRoomId)
                        } else if AppState.shared.pushChannelId > 0 {
                            AppState.shared.setAppStep(step: .creatorDetail(userId: AppState.shared.pushChannelId))
                        } else if AppState.shared.pushAudioContentId > 0 {
                            AppState.shared.setAppStep(step: .contentDetail(contentId: AppState.shared.pushAudioContentId))
                        } else {
                            AppState.shared.setAppStep(step: .main)
                        }
                    }
                }
            }
        } else {
            DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
                withAnimation {
                    if AppState.shared.pushRoomId > 0 {
                        liveViewModel.enterLiveRoom(roomId: AppState.shared.pushRoomId)
                    } else if AppState.shared.pushChannelId > 0 {
                        AppState.shared.setAppStep(step: .creatorDetail(userId: AppState.shared.pushChannelId))
                    } else if AppState.shared.pushAudioContentId > 0 {
                        AppState.shared.setAppStep(step: .contentDetail(contentId: AppState.shared.pushAudioContentId))
                    } else {
                        AppState.shared.setAppStep(step: .main)
                    }
                }
            }
        }
    }
}

struct SplashView_Previews: PreviewProvider {
    static var previews: some View {
        SplashView()
    }
}