import { Image, ScrollView, View } from '@tarojs/components'
import Taro from '@tarojs/taro'
import classnames from 'classnames'
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
import Counter from '../counter'
import BindSalesmanPopup from '../bindSalesmanDialog'
import LabAndImgShow from '../LabAndImgShow'
import LabAndImg from '../LabAndImg'
import styles from './index.module.scss'
import Popup from '@/components/popup'
import MCheckbox from '@/components/checkbox'
import LoadingCard from '@/components/loadingCard'
import InfiniteScroll from '@/components/infiniteScroll'
import { alert, goLink } from '@/common/common'
import { DelShoppingCartApi, GetShoppingCartApi, UpdateShoppingCartApi } from '@/api/shopCart'
import { formatHashTag, formatImgUrl, formatPriceDiv } from '@/common/format'
import { setParam } from '@/common/system'
import { debounce, throttle } from '@/common/util'
import { ApplyOrderAccessApi, GetAdminUserInfoApi, SubscriptionMessageApi } from '@/api/user'
import useCommonData from '@/use/useCommonData'

interface param {
  show?: true | false
  onClose?: () => void
  intoStatus?: 'again' | 'shop'
  default_sale_mode?: number // 面料类型（0：大货， 1：剪版，2：散剪
}
const ShopCart = ({ show = false, onClose, intoStatus = 'shop', default_sale_mode }: param) => {
  const selectList = [
    { value: 0, title: '大货', unit: '条', eunit: 'kg', step: 1, digits: 0, minNum: 1, maxNum: 100000, defaultNum: 1 },
    { value: 1, title: '剪板', unit: '米', eunit: 'm', step: 1, digits: 2, minNum: 0.5, maxNum: 9.99, defaultNum: 1 },
    { value: 2, title: '散剪', unit: '米', eunit: 'kg', step: 1, digits: 2, minNum: 3, maxNum: 100000, defaultNum: 3 },
  ]
  // 获取数据
  const [list, setList] = useState<any[]>([])
  const [loading, setLoading] = useState(false)
  const { fetchData } = GetShoppingCartApi()
  // 切换面料类型
  const [selectIndex, setSelectIndex] = useState(default_sale_mode || 0)
  const selectProduct = (index: number) => {
    setSelectIndex(index)
  }

  // 初始化全部数据默认勾选
  const [checkboxData, setCheckboxData] = useState<Record<number, true | false>>({})
  const initStatus = useRef(false)

  // 全选反选
  const [selectStatus, setSelectStatus] = useState(false)

  const initList = (color_list) => {
    if (initStatus.current) {
      color_list?.forEach((item) => {
        if (selectIndex == item.sale_mode) { checkboxData[item.id] = true }
      })
      initStatus.current = false
    }
    setCheckboxData(() => checkboxData)
  }

  // 重置勾选数据
  const resetList = () => {
    list?.forEach((item) => {
      if (selectIndex == item.sale_mode || selectIndex == -1) {
        checkboxData[item.id] = true
      }
      else {
        checkboxData[item.id] = false
      }
    })
    setCheckboxData(() => ({ ...checkboxData }))
  }

  useEffect(() => {
    setSelectIndex(() => default_sale_mode!)
  }, [default_sale_mode])

  useEffect(() => {
    resetList()
    setSelectStatus(true)
  }, [selectIndex])

  // 绑定业务员和电话号码
  const [showBindSalesman, setShowBindSalesman] = useState(false)
  // 获取购物车数据数量
  const { setShopCount } = useCommonData()

  const getShoppingCart = async() => {
    const { data } = await fetchData()
    const color_list = data.color_list || []
    setShopCount(color_list.length)
    initList(color_list)
    setList(color_list)
    setLoading(false)
  }

  // 显示是展示数据
  useEffect(() => {
    if (!show) {
      setList([])
      setSelectIndex(default_sale_mode || 0)
    }
    else {
      setLoading(true)
      initStatus.current = true
      getShoppingCart()
      setShowBindSalesman(() => false)
    }
  }, [show])

  useEffect(() => {
    return () => {
      setList([])
    }
  }, [])

  const [showPopup, setShowPopup] = useState(false)
  useEffect(() => {
    setShowPopup(show)
  }, [show])

  const selectAll = () => {
    list.forEach((item) => {
      if (selectIndex == item.sale_mode || selectIndex == -1) { checkboxData[item.id] = !selectStatus }
    })
    setSelectStatus(!selectStatus)
    setCheckboxData(() => ({ ...checkboxData }))
  }

  // checkbox选中判断是否全部选中，全部选中后是全选，否则反选
  const checkSelect = () => {
    let list_count = 0
    let select_count = 0
    list?.forEach((item) => {
      if (selectIndex == -1 || selectIndex == item.sale_mode) {
        list_count++
        if (checkboxData[item.id]) { select_count++ }
      }
    })
    setSelectStatus(select_count == list_count)
  }
  // checkbox选中回调
  const selectCallBack = (item) => {
    checkboxData[item.id] = true
    checkSelect()
    setCheckboxData(() => ({ ...checkboxData }))
  }

  // checkbox关闭回调
  const colseCallBack = (item) => {
    checkboxData[item.id] = false
    checkSelect()
    setCheckboxData(() => ({ ...checkboxData }))
  }

  // popup关闭
  const closePopup = () => {
    onClose?.()
    setShowPopup(false)
  }

  // 获取面料选中的id
  const selectIds = useRef<number[]>([])
  const getSelectId = () => {
    selectIds.current = []
    list?.forEach((item) => {
      if (selectIndex == -1 || selectIndex == item.sale_mode) {
        checkboxData[item.id] && selectIds.current.push(item.id)
      }
    })
  }

  // 删除购物车内容
  const { fetchData: delShopFetchData } = DelShoppingCartApi()
  const delSelect = () => {
    getSelectId()
    if (selectIds.current.length <= 0) { return alert.none('请选择要删除的面料!') }
    Taro.showModal({
      content: '删除所选商品？',
      async success(res) {
        if (res.confirm) {
          const res = await delShopFetchData({ id: selectIds.current })
          if (res.success) {
            getShoppingCart()
            Taro.showToast({
              title: '成功',
              icon: 'success',
            })
          }
          else {
            Taro.showToast({
              title: res.msg,
              icon: 'none',
            })
          }
        }
        else if (res.cancel) {
          console.log('用户点击取消')
        }
      },
    })
  }

  // 格式化金额
  const formatPirce = useCallback((price) => {
    return Number(formatPriceDiv(price))
  }, [])

  // 格式化数量
  const formatCount = useCallback((item) => {
    return item.sale_mode == 0 ? item.roll : item.length / 100
  }, [])

  // 格式化单位
  const formatUnit = useCallback((item) => {
    return item.sale_mode == 0 ? '条' : '米'
  }, [])

  // 预估金额和总条数
  const estimatePrice = useMemo(() => {
    let estimate_amount = 0
    const product_list = new Set() // 面料
    let color_count = 0 // 颜色数量
    let all_count = 0 // 总数量
    list.forEach((item) => {
      if (checkboxData[item.id]) {
        estimate_amount += item.estimate_amount
        product_list.add(item.product_id)
        color_count++
        all_count += item.sale_mode == 0 ? item.roll : item.length
      }
    })
    const all_count_text = selectIndex == 0 ? `${all_count} 条` : `${all_count / 100} 米`
    return {
      price: Number(formatPriceDiv(estimate_amount)).toFixed(2),
      countText: `已选 ${product_list.size} 种面料，${color_count} 个颜色，共 ${all_count_text}`,
      color_count,
    }
  }, [list, checkboxData])

  // 去结算
  const { fetchData: FetchData } = GetAdminUserInfoApi()
  const { fetchData: applyOrderAccessFetchData } = ApplyOrderAccessApi()
  const orderDetail = throttle(async() => {
    const res = await FetchData()
    if (res.data.order_access_status !== 3) {
      if (res.data.order_access_status == 1) { applyOrderAccessFetchData() }
      setShowBindSalesman(() => true)
      onClose?.()
      return false
    }
    getSelectId()
    if (selectIds.current.length == 0) {
      alert.error('请选择面料')
    }
    else {
      const ids = selectIds.current.join('-')
      setParam({ ids, sale_mode: selectIndex }) // 临时存储
      closePopup()
      if (intoStatus == 'again') {
        goLink('/pages/order/comfirm', {}, 'redirectTo')
      }
      else {
        goLink('/pages/order/comfirm')
      }
    }
  }, 500)

  // 计数组件-当后端修改完成才修改前端显示
  const { fetchData: fetchDataUpdateShoppingCart } = UpdateShoppingCartApi()
  const [UpdateShoppingCartLoading, setUpdateShoppingCartLoading] = useState(false)
  const getInputValue = debounce(async(num, item) => {
    const roll = item.sale_mode == 0 ? parseFloat(num) : 0
    const length = item.sale_mode != 0 ? parseFloat(num) * 100 : 0
    setUpdateShoppingCartLoading(() => true)
    const res = await fetchDataUpdateShoppingCart({ id: item.id, roll, length })
    setUpdateShoppingCartLoading(() => false)
    if (res.success) {
      getShoppingCart()
    }
  }, 300)

  // 显示图片弹窗
  const [showLabImage, setShowLabImage] = useState(false)
  const [labImageValue, setLabImageValue] = useState()
  const getLabAndImg = useCallback((val) => {
    setShowLabImage(() => true)
    setLabImageValue(val)
  }, [])
  const closeLabImgShow = useCallback(() => {
    setShowLabImage(() => false)
  }, [])

  return (
    <View className={styles.shop_cart_main}>
      <Popup showTitle={false} show={showPopup} onClose={() => closePopup()}>
        <View className={styles.popup_con}>
          <View className={styles.header}>
            <View onClick={selectAll}>{!selectStatus ? '全选' : '反选'}</View>
            <View onClick={delSelect}>
              <text className={classnames('iconfont', 'icon-shanchu', styles.miconfont)}></text>
              删除所选
            </View>
          </View>
          <View className={styles.count_all}>{estimatePrice.countText}</View>
          <View className={styles.search}>
            {selectList.map((item) => {
              return (
                <View
                  key={item.value}
                  onClick={() => selectProduct(item.value)}
                  className={classnames(styles.search_item, selectIndex == item.value && styles.search_item_select)}
                >
                  {item.title}
                </View>
              )
            })}
          </View>
          <View className={styles.con}>
            {loading && <LoadingCard />}
            {!loading && list?.length > 0 && (
              <InfiniteScroll moreStatus={false}>
                <View className={styles.product_list}>
                  {list?.map((item) => {
                    return (
                      <View
                        key={item}
                        className={classnames(styles.product_item, selectIndex != -1 && selectIndex != item.sale_mode && styles.no_product_item_select)}
                      >
                        <View className={styles.checkbox}>
                          <MCheckbox
                            disabled={selectIndex != -1 && selectIndex != item.sale_mode}
                            status={!!checkboxData[item.id]}
                            onSelect={() => selectCallBack(item)}
                            onClose={() => colseCallBack(item)}
                          />
                        </View>
                        <View className={styles.img}>
                          <LabAndImg
                            value={{ lab: item.lab, rgb: item.rgb, texture_url: item.texture_url, title: item.product_color_code }}
                            showStatus={false}
                            onClick={getLabAndImg}
                          />
                        </View>
                        <View className={styles.product_item_name}>
                          <View className={styles.product_item_name_header}>
                            <View className={styles.title}>{formatHashTag(item.product_code, item.product_name)}</View>
                            <View className={styles.price}>
                              <text>￥</text>
                              {formatPirce(item.sale_price)}
                              <text>/{selectList[item.sale_mode].eunit}</text>
                            </View>
                          </View>
                          <View className={styles.count}>
                            <View className={styles.des}>
                              <View className={styles.subtitle}>{`${item.product_color_code} ${item.product_color_name}`}</View>
                              <View className={styles.tag}>{item.sale_mode_name}</View>
                            </View>
                            <View className={styles.btn_count}>
                              <Counter
                                onBlue={e => getInputValue(e, item)}
                                defaultNum={formatCount(item)}
                                step={selectList[selectIndex].step}
                                digits={selectList[selectIndex].digits}
                                onClickBtn={e => getInputValue(e, item)}
                                unit={formatUnit(item)}
                                minNum={selectList[selectIndex].minNum}
                                maxNum={selectList[selectIndex].maxNum}
                                disable={UpdateShoppingCartLoading}
                              />
                            </View>
                          </View>
                        </View>
                      </View>
                    )
                  })}
                </View>
              </InfiniteScroll>
            )}
            {!loading && list?.length == 0 && (
              <View className={styles.empty}>
                <View className={styles.title}>暂未选择商品</View>
                <View className={styles.btn}>去选购</View>
              </View>
            )}
          </View>
          <View className={styles.buy_btn}>
            <View className={styles.buy_con}>
              <View className={styles.icon}>
                <View className={classnames('iconfont', 'icon-gouwuche', styles.miconfont)}></View>
              </View>
              <View className={styles.price_con}>
                <View className={styles.price_real}>
                  <text>￥</text>
                  {estimatePrice.price}
                </View>
                <View className={styles.price_forecast}>预估金额</View>
              </View>
              <View className={styles.goPay} onClick={() => orderDetail()}>
                去结算({estimatePrice.color_count})
              </View>
            </View>
          </View>
        </View>
      </Popup>
      <View>
        <BindSalesmanPopup show={showBindSalesman} onClose={() => setShowBindSalesman(false)} />
      </View>
      <View>
        <LabAndImgShow value={labImageValue} show={showLabImage} onClose={closeLabImgShow} />
      </View>
    </View>
  )
}

export default ShopCart
