import { connect } from "react-redux"
import { createSelector } from "reselect"
import { RootState } from "../scripts/reducer"
import { ContextMenuType, closeContextMenu } from "../scripts/models/app"
import { ContextMenu } from "../components/context-menu"
import { RSSItem, markRead, markUnread, toggleStarred, toggleHidden } from "../scripts/models/item"
import { showItem, switchView, ViewType, switchFilter, toggleFilter } from "../scripts/models/page"
import { setDefaultView } from "../scripts/utils"
import { FeedFilter } from "../scripts/models/feed"

const getContext = (state: RootState) => state.app.contextMenu
const getViewType = (state: RootState) => state.page.viewType
const getFilter = (state: RootState) => state.page.filter

const mapStateToProps = createSelector(
    [getContext, getViewType, getFilter],
    (context, viewType, filter) => {
        switch (context.type) {
            case ContextMenuType.Item: return {
                type: context.type,
                event: context.event,
                item: context.target[0],
                feedId: context.target[1]
            }
            case ContextMenuType.Text: return {
                type: context.type,
                position: context.position,
                text: context.target as string
            }
            case ContextMenuType.View: return {
                type: context.type,
                event: context.event,
                viewType: viewType,
                filter: filter
            }
            default: return { type: ContextMenuType.Hidden }
        }
    }
)

const mapDispatchToProps = dispatch => {
    return {
        showItem: (feedId: string, item: RSSItem) => dispatch(showItem(feedId, item)),
        markRead: (item: RSSItem) => dispatch(markRead(item)),
        markUnread: (item: RSSItem) => dispatch(markUnread(item)),
        toggleStarred: (item: RSSItem) => dispatch(toggleStarred(item)),
        toggleHidden: (item: RSSItem) => dispatch(toggleHidden(item)),
        switchView: (viewType: ViewType) => {
            setDefaultView(viewType)
            dispatch(switchView(viewType))
        },
        switchFilter: (filter: FeedFilter) => dispatch(switchFilter(filter)),
        toggleFilter: (filter: FeedFilter) => dispatch(toggleFilter(filter)),
        close: () => dispatch(closeContextMenu())
    }
}

const connector = connect(mapStateToProps, mapDispatchToProps)
export type ContextReduxProps = typeof connector
export const ContextMenuContainer = connector(ContextMenu)