import ComponentLibrary
import ComposableArchitecture
import Localization
import NavigationRouterClient
import StatsigClient
import SwiftUI
import UserDefaultsClient
import Utilities

public enum AppearanceMode: String, Equatable, Codable {
    case light
    case dark
    case system
}

@Reducer
public struct Appearance {
    @ObservableState
    public struct State: Equatable {
        @Shared(.appStorage(.appearanceMode)) var selectedMode: AppearanceMode = .system

        public init() {}
    }

    public enum Action {
        case didSelectMode(AppearanceMode)
    }

    public init() {}

    public var body: some ReducerOf<Appearance> {
        Reduce { state, action in
            switch action {
            case let .didSelectMode(mode):
                state.$selectedMode.withLock { $0 = mode }
                if let window = UIWindow.current {
                    switch mode {
                    case .light:
                        window.overrideUserInterfaceStyle = .light
                    case .dark:
                        window.overrideUserInterfaceStyle = .dark
                    case .system:
                        window.overrideUserInterfaceStyle = .unspecified
                    }
                }
                return .none
            }
        }
    }
}

public struct AppearanceScreen: View {
    @Bindable var store: StoreOf<Appearance>

    public init(store: StoreOf<Appearance>) {
        self.store = store
    }

    public var body: some View {
        VStack {
            AppearanceScreenRow(
                title: L10n.FeatureSettings.lightMode,
                isSelected: store.selectedMode == .light,
                action: { store.send(.didSelectMode(.light)) }
            )
            AppearanceScreenRow(
                title: L10n.FeatureSettings.darkMode,
                isSelected: store.selectedMode == .dark,
                action: { store.send(.didSelectMode(.dark)) }
            )
            AppearanceScreenRow(
                title: L10n.FeatureSettings.deviceSettings,
                isSelected: store.selectedMode == .system,
                action: { store.send(.didSelectMode(.system)) }
            )
            Spacer()
        }
        .background(Color.SemanticV2.backgroundGlassThin)
        .navigationBarTitleDisplayMode(.inline)
        .navigationTitle(L10n.FeatureSettings.appearance)
    }
}

public struct AppearanceScreenRow: View {
    let title: String
    let isSelected: Bool
    let action: () -> Void

    public init(title: String, isSelected: Bool, action: @escaping () -> Void) {
        self.title = title
        self.isSelected = isSelected
        self.action = action
    }

    public var body: some View {
        Button {
            action()
        } label: {
            VStack(spacing: 0) {
                HStack(spacing: 6) {
                    RadioButton(isSelected: isSelected)

                    Text(title)
                        .typographyV1(.body3)
                        .foregroundStyle(Color.SemanticV2.foregroundPrimary)
                    Spacer()
                }
                .padding(.vertical, 16)
                .padding(.horizontal, 16)

                Color.SemanticV2.backgroundTertiary
                    .frame(height: 0.5)
                    .padding(.horizontal, 8)
            }
        }
    }
}

#Preview {
    NavigationStack {
        AppearanceScreen(store: .init(initialState: Appearance.State(), reducer: {
            Appearance()
        }))
    }
}
