
import APIClient
import ComposableArchitecture
import FeatureOnboardingScreens
import SwiftUI

@Reducer
public struct DemoOnboardingCreate {
    @ObservableState
    public struct State: Equatable {
        var onboardingCreate = OnboardingCreate.State(me: .init(
            models: [],
            roles: [:],
            flags: [:],
            user: .empty()
        ))

        public init() {}
    }

    public enum Action {
        case task
        case onAppear
        case dismiss
        case onboardingCreate(OnboardingCreate.Action)
    }

    public init() {}

    public var body: some ReducerOf<Self> {
        Scope(state: \.onboardingCreate, action: \.onboardingCreate) {
            OnboardingCreate()
        }
        Reduce<State, Action> { _, action in
            switch action {
            case .onAppear:
                return .none

            case .onboardingCreate(.delegate(let delegateAction)):
                switch delegateAction {
                case .requestStyles(let excluded):
                    let exludedSet = Set(excluded)
                    return .send(.onboardingCreate(.setRecommendedStyles(
                        DemoOnboardingCreate.demoStyles.filter { !exludedSet.contains($0) }
                    )))

                case .tappedCreate:
                    return .none

                case .tappedBack:
                    return .none

                case .tappedSkip:
                    return .none

                case .createAppeared:
                    return .none
                }

            case .onboardingCreate:
                return .none

            case .task:
                return .none

            case .dismiss:
                return .none
            }
        }
    }

    public static var demoStyles: [String] {
        return [
            "Alternative Rock",
            "Ambient",
            "Blues",
            "Chillwave",
            "Classical",
            "Country",
            "Dancehall",
            "Deep House",
            "Disco",
            "Dream Pop",
            "Drum and Bass",
            "Dubstep",
            "Electro Swing",
            "Electronic",
            "Emo",
            "Folk",
            "Funk",
            "Garage Rock",
            "Gothic Rock",
            "Hard Rock",
            "Hip-Hop",
            "House",
            "Indie Folk",
            "Indie Rock",
            "Industrial",
            "Jazz",
            "Lo-Fi",
            "Metal",
            "New Wave",
            "Psychedelic Rock",
        ]
    }
}

public struct DemoOnboardingCreateView: View {
    let store: StoreOf<DemoOnboardingCreate>
    @Environment(\.scenePhase) var scenePhase

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

    public var body: some View {
        VStack(spacing: .zero) {
            DemoTitleHeaderBar(
                title: "Onboarding Create",
                onBackAction: {
                    store.send(.dismiss)
                }
            )
            OnboardingCreateScreen(store: store.scope(
                state: \.onboardingCreate,
                action: \.onboardingCreate
            ))
        }
        .task {
            store.send(.task)
        }
        .onAppear {
            store.send(.onAppear)
        }
    }
}
