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

@ObservableState
public struct MoreOptionsState: Equatable {
    var isSaving = false
    var error: AnyError?
    var clip: Clip
    var toggleHapticSuccess = false
    var toggleHapticError = false
    var pinnedClipsList: IdentifiedArrayOf<Clip> = []
    var showPinToProfile: Bool
    var hasConfirmedPinLimitReplace = false

    var commentsToggle: ToggleState
    var downloadsToggle: ToggleState
    var remixingToggle: ToggleState
    var pinningToggle: ToggleState
    var videoCoverInHooksFeedToggle: ToggleState

    @ObservableState
    public enum ToggleState: Equatable {
        case idle(Bool)
        case updating(Bool)
        case error(AnyError)

        var currentValue: Bool {
            switch self {
            case .idle(let value): return value
            case .updating(let value): return value
            case .error: return false
            }
        }
    }

    @ObservationStateIgnored @ObservedBox var brandedAlert: BrandedAlert.State = .init(style: .noAlert)

    public init(clip: Clip, allowComments: Bool, allowDownloads: Bool, allowRemixing: Bool, showPinToProfile: Bool) {
        self.clip = clip
        self.showPinToProfile = showPinToProfile
        self.commentsToggle = .idle(allowComments)
        self.downloadsToggle = .idle(allowDownloads)
        self.remixingToggle = .idle(allowRemixing)
        self.pinningToggle = .idle(clip.isPinned)
        self.videoCoverInHooksFeedToggle = .idle(!clip.optOutVideoCoverHook)
    }
}
