//
//  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_bg")
                .resizable()
                .aspectRatio(contentMode: .fill)
                .edgesIgnoringSafeArea(.all)
            
            VStack(spacing: 0) {
                Image("splash_text")
                    .padding(.top, 101)
                
                Spacer()
                
                Image("splash_text_2")
                    .padding(.bottom, 65)
            }
            
            if isShowUpdatePopup {
                SodaDialog(
                    title: "업데이트",
                    desc: "최신 업데이트가 있습니다.\n업데이트 하시겠습니까?",
                    confirmButtonTitle: "업데이트",
                    confirmButtonAction: {
                        UIApplication.shared.open(URL(string: "https://apps.apple.com/us/app/id6461721697?mt=8")!, options: [:])
                    },
                    cancelButtonTitle: "다음에",
                    cancelButtonAction: {
                        DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
                            AppState.shared.setAppStep(step: .main)
                        }
                    }
                )
            }
            
            if isShowForcedUpdatePopup {
                SodaDialog(
                    title: "업데이트",
                    desc: "필수 업데이트가 있습니다.\n업데이트 후 사용가능합니다.",
                    confirmButtonTitle: "업데이트",
                    confirmButtonAction: {
                        UIApplication.shared.open(URL(string: "https://apps.apple.com/us/app/id6461721697?mt=8")!, options: [:])
                    }
                )
            }
            
        }
        .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()
    }
}