import { Image, ScrollView, Text, View } from '@tarojs/components'
import Taro, { useDidShow, usePullDownRefresh, useRouter } from '@tarojs/taro'
import classnames from 'classnames'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import type { ListProps } from './components/selectData'
import SelectData from './components/selectData'
import styles from './searchList.module.scss'
import Search from '@/components/search'
import Filter from '@/components/filter'
import InfiniteScroll from '@/components/infiniteScroll'
import SortBtn from '@/components/sortBtn'
import { goLink } from '@/common/common'
import { GetProductListApi } from '@/api/material'
import { formatHashTag, formatImgUrl } from '@/common/fotmat'
import { dataLoadingStatus, getFilterData } from '@/common/util'
import useLogin from '@/use/useLogin'
import LabAndImg from '@/components/LabAndImg'

export default () => {
  useLogin()

  const [showFilter, setShowFilter] = useState(false)
  const router = useRouter()

  // 搜索参数
  const [searchField, setSearchField] = useState({
    code_or_name: router.params.key,
    page: 1,
    size: 10,
    width: '',
    weight_density: '',
    product_kind_id: '',
    component: '',
    abstract_sort_key: '',
  })

  // 获取面料列表
  const [materialList, setMaterialList] = useState<{ list: any[]; total: number }>({ list: [], total: 0 })
  const { fetchData: materialFetchData, state: materialState } = GetProductListApi()
  const getProductList = async() => {
    const { data } = await materialFetchData(getFilterData(searchField))
    setMaterialList({ list: data.list, total: data.total })
    Taro.stopPullDownRefresh()
  }

  // 监听筛选条件变化
  useEffect(() => {
    getProductList()
  }, [searchField])

  // 上拉加载数据
  const pageNum = useRef({ size: searchField.size, page: searchField.page })
  const getScrolltolower = () => {
    if (materialList.list.length < materialList.total) {
      pageNum.current.page++
      const size = pageNum.current.size * pageNum.current.page
      setSearchField({ ...searchField, size })
    }
  }

  // 数据加载状态
  const statusMore = useMemo(() => {
    return dataLoadingStatus({ list: materialList.list, total: materialList.total, status: materialState.loading })
  }, [materialList, materialState])

  // 输入了搜索关键字
  const getSearchData = useCallback((e) => {
    pageNum.current.page = 1
    setMaterialList(() => ({ list: [], total: 0 }))
    setSearchField(val => ({ ...val, code_or_name: e, size: 10 }))
    pageNum.current = { size: 10, page: 1 }
  }, [])

  const goLinkPage = (item) => {
    goLink('/pages/details/index', { id: item.id })
  }

  // 页面下拉刷新
  usePullDownRefresh(() => {
    setSearchField({ ...searchField, size: 10 })
  })

  // 获取筛选条件
  const getFiltr = (e) => {
    pageNum.current.page = 1
    setMaterialList(() => ({ list: [], total: 0 }))
    const { data } = e
    setSearchField({
      ...searchField,
      width: data?.width,
      weight_density: data?.weight,
      size: 10,
      component: data?.element,
      product_kind_id: data?.seriesId,
    })
    formatSelectList(e)
  }

  // 筛选条件格式化
  const [selectList, setSelectList] = useState<ListProps[]>()
  const formatSelectList = (val = { data: {}, field: {} }) => {
    const data: ListProps[] = []
    for (const key in val.data) {
      if (key !== 'seriesId' && val.data[key] != '') {
        data.push({ title: val.field[key], value: val.data[key] })
      }
    }
    setSelectList([...data])
  }

  // 排序
  type sortParam = 'none' | 'top' | 'bottom'
  const sortComprehensiveRef = useRef<any>(null)
  const sortCollectionRef = useRef<any>(null)
  const [sortStatus, setSortStatus] = useState<{ comprehensive: sortParam; collection: sortParam }>({
    comprehensive: 'none',
    collection: 'none',
  })
  const changeSort = (val) => {
    if (val == 1) {
      const { status, value } = sortComprehensiveRef.current.changeSort()
      setSortStatus(e => ({ ...e, comprehensive: status, collection: 'none' }))
      setSearchField(e => ({ ...e, abstract_sort_key: value, size: 10, page: 1 }))
    }
    else {
      const { status, value } = sortCollectionRef.current.changeSort()
      setSortStatus(e => ({ ...e, collection: status, comprehensive: 'none' }))
      setSearchField(e => ({ ...e, abstract_sort_key: value, size: 10, page: 1 }))
    }
    pageNum.current = { size: 10, page: 1 }
  }

  const labAndImgObj = useCallback(
    (item) => {
      const img = item ? item.texture_url.split(',')[0] : ''
      return { lab: item.lab, rgb: item.rgb, texture_url: img }
    },
    [materialList],
  )
  return (
    <View className={styles.main}>
      <View className={styles.search}>
        <Search placeIcon="out" placeholder="请输入面料关键词" defaultValue={router.params.key} changeOnSearch={getSearchData} debounceTime={300} />
      </View>
      <View className={styles.filter}>
        <View className={styles.filter_all}>
          <View className={styles.text_zh} onClick={() => changeSort(1)}>
            <Text>综合</Text>
            <SortBtn status={sortStatus.comprehensive} ref={sortComprehensiveRef} sortValue={{ desc: '1', asc: '-1' }} />
          </View>
          <View className={styles.text_sc} onClick={() => changeSort(2)}>
            <Text>收藏</Text>
            <SortBtn status={sortStatus.collection} ref={sortCollectionRef} sortValue={{ desc: '2', asc: '-2' }} />
          </View>
          <View className={styles.text_ss} onClick={() => goLink('/pages/searchList/hightSearchList')}>
            <Text>高级搜索</Text>
            <Text className={classnames('iconfont icon-sousuo', styles.miconfont)}></Text>
          </View>
        </View>

        <View className={styles.filter_btn_con}>
          <View className={styles.filter_scroll}>
            <SelectData list={selectList} />
          </View>
          <View className={styles.filter_more} onClick={() => setShowFilter(true)}>
            <Text>筛选</Text>
            <Text className={classnames('iconfont icon-shaixuan', styles.miconfont)}></Text>
          </View>
        </View>
      </View>
      <View className={styles.list}>
        <View className={classnames(styles.list_num, styles.list_num_shadow)}>搜索结果 ({materialList.total}条记录)</View>
        <View className={styles.scroll}>
          <InfiniteScroll selfonScrollToLower={getScrolltolower} statusMore={statusMore}>
            <View className={styles.product_list}>
              {materialList.list.map((item) => {
                return (
                  <View key={item.id} className={styles.product_item} onClick={() => goLinkPage(item)}>
                    <View className={styles.product_img}>
                      <LabAndImg value={labAndImgObj(item)} />
                      <View className={styles.color_num}>{item.product_color_count}色</View>
                    </View>
                    <View className={styles.product_info}>
                      <View className={styles.title}>{formatHashTag(item.code, item.name)}</View>
                      <View className={styles.tag_list}>
                        <View className={styles.tag}>{item.width}</View>
                        <View className={styles.tag}>{item.weight_density}</View>
                      </View>
                      <View className={styles.introduce}>{item.component}</View>
                    </View>
                  </View>
                )
              })}
            </View>
          </InfiniteScroll>
        </View>
      </View>
      <Filter show={showFilter} onClose={() => setShowFilter(false)} onFiltr={e => getFiltr(e)} />
    </View>
  )
}
