import APIClient
import ComponentLibrary
import ComposableArchitecture
import Errors
import FeatureBrandedAlert
import GenAPI
import Localization
import SwiftUI
import Utilities

@ObservableState
public struct EditDisplayStylesState: Equatable {
    enum Field: String, Hashable {
        case displayTags
    }

    var focusedField: Field?
    var isSaving = false
    var error: AnyError?
    var clip: Clip
    var toggleHapticSuccess = false
    var toggleHapticError = false

    @Presents public var destination: EditDisplayStylesReducer.Destination.State?

    @ObservableState
    public struct FieldState<T: Equatable>: Equatable {
        let initialValue: T
        var currentValue: T

        public init(value: T) {
            self.initialValue = value
            self.currentValue = value
        }

        mutating func update(_ newValue: T) {
            self.currentValue = newValue
        }

        mutating func reset() {
            self.currentValue = initialValue
        }

        var hasChanges: Bool {
            return initialValue != currentValue
        }

        var isEmpty: Bool {
            if let stringValue = currentValue as? String {
                return stringValue.isEmpty
            }
            return false
        }
    }

    var displayStylesField: FieldState<String>

    public init(clip: Clip) {
        self.clip = clip
        self.displayStylesField = FieldState(value: clip.displayTags ?? "")
    }
}
