import APIClient
import ComponentLibrary
import ComposableArchitecture
import FeatureHooksGrid
import FeatureHooksModels
import UIKit
import Utilities

@Reducer
public struct UserHooksGridReducer {
    @ObservableState
    public struct State: Equatable {
        let showBackButton: Bool
        let userHandle: String
        var hooksGrid: HooksGridReducer.State

        public init(
            showBackButton: Bool,
            userHandle: String,
            hooksGrid: HooksGridReducer.State
        ) {
            self.showBackButton = showBackButton
            self.userHandle = userHandle
            self.hooksGrid = hooksGrid
        }
    }

    public enum Action {
        case hooksGrid(HooksGridReducer.Action)
        case dismiss
    }

    @Dependency(\.apiClientV2) var api
    @Dependency(\.dismiss) var dismiss

    public init() {}

    public var body: some ReducerOf<Self> {
        Scope(state: \.hooksGrid, action: \.hooksGrid) {
            HooksGridReducer()
        }
        .withHooksGridClient { state in
            HooksGridClient(
                getHooks: { page in
                    let profile = try await api.getProfile(state.userHandle, page, .playCount, false, true)
                    return profile.hooks
                }
            )
        }

        Reduce { _, action in
            switch action {
            case .hooksGrid:
                return .none

            case .dismiss:
                return .run { _ in await dismiss() }
            }
        }
    }
}
