//
//  SwiftLoginViewModel.swift
//  iosApp
//
//  Created by Coach Roebuck on 8/14/23.
//  Copyright © 2023 orgName. All rights reserved.
//


import Foundation
import Combine
import shared
import SwiftUI

class SwiftLoginViewModel: ObservableObject {
    @Published var state: LoginViewModelStore.State
    
    private var pendingEmail: String = ""
    
    var viewModel: LoginViewModel

    init(viewModel: LoginViewModel) {
        self.viewModel = viewModel
        self.state = LoginViewModelStore.StateIdle.shared
    }
    
    func update(email: String? = nil,
                         isLoginEnabled: Bool? = nil,
                         isInProgressEnabled: Bool? = nil,
                         isEmailErrorEnabled: Bool? = nil,
                         isBackPressed: Bool? = nil,
                         throwable: KotlinThrowable? = nil) -> LoginViewModelStore.StateCurrentState {
            return LoginViewModelStore.StateCurrentState(
                email: email ?? self.email.wrappedValue,
                isLoginEnabled: isLoginEnabled ?? self.isLoginEnabled.wrappedValue,
                isInProgressEnabled: isInProgressEnabled ?? self.isInProgressEnabled.wrappedValue,
                isEmailErrorEnabled: isEmailErrorEnabled ?? self.isEmailErrorEnabled.wrappedValue,
                throwable: throwable ?? KotlinThrowable.init(message: errorMessage.wrappedValue)
            )
        }
    
    var email: Binding<String> {
        Binding<String>(
            get: {
                if let currentState = self.state as? LoginViewModelStore.StateCurrentState {
                    return currentState.email
                } else {
                    print("get email: self.pendingEmail=[\(self.pendingEmail)]")
                    
                    return self.pendingEmail
                }
            },
            set: { newValue in
                print("set email: self.pendingEmail=[\(self.pendingEmail)] self.state=[\(self.state)]")
                if self.state is LoginViewModelStore.StateCurrentState {
                    self.state = self.update(email: newValue)
                } else {
                    self.pendingEmail = newValue
                }
            }
        )
    }
    
    var errorMessage: Binding<String?> {
        Binding<String?>(
            get: {
                if let currentState = self.state as? LoginViewModelStore.StateCurrentState {
                    return currentState.throwable?.message
                } else {
                    return nil
                }
            },
            set: { newValue in
                
            }
        )
    }
    
    var isLoginEnabled: Binding<Bool> {
        Binding<Bool>(
            get: {
                if let currentState = self.state as? LoginViewModelStore.StateCurrentState {
                    return currentState.isLoginEnabled
                } else {
                    return false
                }
            },
            set: { newValue in
                // Handle setting the new value here
                // You might want to emit the email changed intent here
            }
        )
    }
    
    var isInProgressEnabled: Binding<Bool> {
        Binding<Bool>(
            get: {
                if let currentState = self.state as? LoginViewModelStore.StateCurrentState {
                    return currentState.isInProgressEnabled
                } else {
                    return false
                }
            },
            set: { newValue in
                // Handle setting the new value here
                // You might want to emit the email changed intent here
            }
        )
    }
    
    var isEmailErrorEnabled: Binding<Bool> {
        Binding<Bool>(
            get: {
                if let currentState = self.state as? LoginViewModelStore.StateCurrentState {
                    return currentState.isEmailErrorEnabled
                } else {
                    return false
                }
            },
            set: { newValue in
                // Handle setting the new value here
                // You might want to emit the email changed intent here
            }
        )
    }
    
    // Here you could add @Published properties and methods that
    // wrap or adapt the MainViewModel's properties and methods.
    // These will be able to be observed by SwiftUI.
}
