'use client'

import type { PluginDetail } from '../../../types'
import { useSuspenseQuery } from '@tanstack/react-query'
import { useBoolean } from 'ahooks'
import { useCallback, useMemo, useState } from 'react'
import { systemFeaturesQueryOptions } from '@/service/system-features'
import useReferenceSetting from '../../../plugin-page/use-reference-setting'
import { AUTO_UPDATE_MODE } from '../../../reference-setting-modal/auto-update-setting/types'
import { PluginSource } from '../../../types'

export type VersionTarget = {
  version: string | undefined
  unique_identifier: string | undefined
  isDowngrade?: boolean
}

export type ModalStates = {
  isShowUpdateModal: boolean
  showUpdateModal: () => void
  hideUpdateModal: () => void
  isShowPluginInfo: boolean
  showPluginInfo: () => void
  hidePluginInfo: () => void
  isShowDeleteConfirm: boolean
  showDeleteConfirm: () => void
  hideDeleteConfirm: () => void
  deleting: boolean
  showDeleting: () => void
  hideDeleting: () => void
}

type VersionPickerState = {
  isShow: boolean
  setIsShow: (show: boolean) => void
  targetVersion: VersionTarget
  setTargetVersion: (version: VersionTarget) => void
  isDowngrade: boolean
  setIsDowngrade: (downgrade: boolean) => void
}

type UseDetailHeaderStateReturn = {
  modalStates: ModalStates
  versionPicker: VersionPickerState
  hasNewVersion: boolean
  isAutoUpgradeEnabled: boolean
  isFromGitHub: boolean
  isFromMarketplace: boolean
}

export const useDetailHeaderState = (detail: PluginDetail): UseDetailHeaderStateReturn => {
  const { data: enable_marketplace } = useSuspenseQuery({
    ...systemFeaturesQueryOptions(),
    select: s => s.enable_marketplace,
  })
  const { referenceSetting } = useReferenceSetting()

  const {
    source,
    version,
    latest_version,
    latest_unique_identifier,
    plugin_id,
  } = detail

  const isFromGitHub = source === PluginSource.github
  const isFromMarketplace = source === PluginSource.marketplace
  const [isShow, setIsShow] = useState(false)
  const [targetVersion, setTargetVersion] = useState<VersionTarget>({
    version: latest_version,
    unique_identifier: latest_unique_identifier,
  })
  const [isDowngrade, setIsDowngrade] = useState(false)

  const [isShowUpdateModal, { setTrue: showUpdateModal, setFalse: hideUpdateModal }] = useBoolean(false)
  const [isShowPluginInfo, { setTrue: showPluginInfo, setFalse: hidePluginInfo }] = useBoolean(false)
  const [isShowDeleteConfirm, { setTrue: showDeleteConfirm, setFalse: hideDeleteConfirm }] = useBoolean(false)
  const [deleting, { setTrue: showDeleting, setFalse: hideDeleting }] = useBoolean(false)

  const hasNewVersion = useMemo(() => {
    if (isFromMarketplace)
      return !!latest_version && latest_version !== version
    return false
  }, [isFromMarketplace, latest_version, version])

  const { auto_upgrade: autoUpgradeInfo } = referenceSetting || {}

  const isAutoUpgradeEnabled = useMemo(() => {
    if (!enable_marketplace || !autoUpgradeInfo || !isFromMarketplace)
      return false
    if (autoUpgradeInfo.strategy_setting === 'disabled')
      return false
    if (autoUpgradeInfo.upgrade_mode === AUTO_UPDATE_MODE.update_all)
      return true
    if (autoUpgradeInfo.upgrade_mode === AUTO_UPDATE_MODE.partial && autoUpgradeInfo.include_plugins.includes(plugin_id))
      return true
    if (autoUpgradeInfo.upgrade_mode === AUTO_UPDATE_MODE.exclude && !autoUpgradeInfo.exclude_plugins.includes(plugin_id))
      return true
    return false
  }, [autoUpgradeInfo, plugin_id, isFromMarketplace, enable_marketplace])

  const handleSetTargetVersion = useCallback((version: VersionTarget) => {
    setTargetVersion(version)
    if (version.isDowngrade !== undefined)
      setIsDowngrade(version.isDowngrade)
  }, [])

  return {
    modalStates: {
      isShowUpdateModal,
      showUpdateModal,
      hideUpdateModal,
      isShowPluginInfo,
      showPluginInfo,
      hidePluginInfo,
      isShowDeleteConfirm,
      showDeleteConfirm,
      hideDeleteConfirm,
      deleting,
      showDeleting,
      hideDeleting,
    },
    versionPicker: {
      isShow,
      setIsShow,
      targetVersion,
      setTargetVersion: handleSetTargetVersion,
      isDowngrade,
      setIsDowngrade,
    },
    hasNewVersion,
    isAutoUpgradeEnabled,
    isFromGitHub,
    isFromMarketplace,
  }
}
