import request from '@/helpers/request'
import { browser, moneyFormat } from '@/helpers/utils'
import {
  Swipe,
  SwipeItem,
  Image,
  CellGroup,
  Cell,
  ImagePreview,
  RadioGroup,
  Radio,
  Tag,
  Row,
  Col,
  Sticky,
  ActionBar,
  ActionBarButton,
  ActionBarIcon,
  Icon,
  Badge,
  Toast,
  Popup,
  SubmitBar,
  Card
} from 'vant'
import { defineComponent } from 'vue'
import styles from './index.module.less'
import iconShopCart from '../images/icon-shop-cart.png'
import AddGoodsCart from '../modal/add-goods-cart'
import ColHeader from '@/components/col-header'
import iconShare from '../images/icon-share.svg'
import ColShare from '@/components/col-share'
import { state } from '@/state'
import { useEventTracking } from '@/helpers/hooks'

export default defineComponent({
  name: 'goods-detail',
  data() {
    const query = this.$route.query
    return {
      id: query.id,
      albumPics: [] as any[],
      product: {} as Record<string | number | symbol, any>,
      radio: 0,
      skuStockListTemp: [],
      detailMobileHtml: '',
      loading: false,
      addGoodsShow: false,
      selectGoodsItem: {},
      cartCount: 0,
      showType: 'cart',
      shareShow: false // 分享弹窗
    }
  },
  computed: {
    skuStockList() {
      // 处理规格
      const product = this.product
      const skuStockList: any =
        this.skuStockListTemp.length > 0
          ? this.skuStockListTemp
          : [
              {
                id: -1,
                price: product.price,
                pic: product.pic,
                stock: product.stock,
                spData: null
              }
            ]
      skuStockList.forEach((item: any) => {
        if (item.spData) {
          const spData = JSON.parse(item.spData)
          item.spDataJson = spData.reduce((spDataJson, value) => {
            spDataJson += value.value
            return spDataJson
          }, '')
          item.sku = spData
            .reduce((sku, value) => {
              sku.push(`${value.key}: ${value.value}`)
              return sku
            }, [])
            .join(',')
        } else {
          item.spDataJson = '默认'
        }
      })
      return skuStockList
    },
    getPrice() {
      const item = this.skuStockList.filter(n => n.id == this.radio) as any
      if (item && Array.isArray(item) && item.length) {
        return item[0].price
      }
      return 0
    },

    shareUrl() {
      // 分享链接
      const productId = this.product.id as any
      if (browser().isApp) {
        return `${location.origin}/teacher/#/shareMall?bizId=${productId}&userId=${state.user.data.userId}&userType=${state.platformType}&p=tenant`
      } else {
        return `${location.origin}/teacher.html#/shareMall?bizId=${productId}&userId=${state.user.data.userId}&userType=${state.platformType}&p=tenant`
      }
    },
    platformStatus() {
      const userInfo = state.user.data as any
      // 是机构学生 并且 是机构老师分享
      const query = this.$route.query
      return userInfo.tenantId > 0 && query.p == 'tenant'
    }
  },
  async mounted() {
    try {
      this.loading = true
      const res = await request.get(
        `/api-mall-portal/product/detail/${this.id}`
      )
      this.loading = false
      const result = res.data || {}
      this.albumPics = [result.product.pic]
        .concat(result.product.albumPics.split(','))
        .filter(n => n)
      this.product = result.product
      this.skuStockListTemp = result.skuStockList || []
      if (this.skuStockListTemp.length) {
        const len = this.skuStockListTemp.length
        for (let i = 0; i < len; i++) {
          const item = this.skuStockListTemp[i] as any
          if (item.stock >= 0) {
            this.radio = item.id
            break
          }
        }
      }
      this.detailMobileHtml = result.product.detailMobileHtml
    } catch {}
    this.getCartCount()
    useEventTracking('商品详情')
  },
  methods: {
    onPreview(index: number) {
      // 图片预览
      ImagePreview({
        images: this.albumPics,
        startPosition: index,
        closeable: true,
        className: styles.imagesOverlayWrap
      })
    },
    onShowImg(target: any) {
      const { localName } = target.srcElement
      if (localName !== 'img') {
        return
      }
      let startPosition = 0
      const domList = document.querySelectorAll('.msgWrap img')
      const imgList = Array.from(domList).map((item: any, index: number) => {
        if (target.srcElement == item) {
          startPosition = index
        }
        return item.src
      })

      ImagePreview({
        images: imgList,
        startPosition: startPosition,
        closeable: true,
        className: styles.imagesOverlayWrap
      })
    },
    onShowCart(type = 'cart') {
      this.selectGoodsItem = {
        price: this.product.pic,
        stock: this.product.stock,
        skuStockList: this.skuStockListTemp.length
          ? this.skuStockListTemp
          : undefined,
        brandName: this.product.brandName,
        productCategoryId: this.product.productCategoryId,
        name: this.product.name,
        productSn: this.product.productSn,
        productSubTitle: this.product.subTitle,
        id: this.product.id
      }
      this.showType = type
      // 打开购物弹框
      this.addGoodsShow = true
    },
    onBuy() {
      // 购买
      if (!this.radio) {
        return Toast('请选择规格')
      }
      console.log(true)
    },
    async getCartCount() {
      try {
        const { code, data } = await request.get('/api-mall-portal/cart/list')
        if (code === 200) {
          this.cartCount = data.length
        }
      } catch (err) {}
    }
  },
  render() {
    const product = this.product
    const selectSku = this.skuStockList.find((n: any) => n.id === this.radio)
    const sharePic = this.product.pic + '?v=' + Date.now()
    return (
      <div class={styles.goodsDetail}>
        <ColHeader
          v-slots={{
            right: () => (
              <div
                class={styles.shareBtn}
                onClick={() => (this.shareShow = true)}
              >
                <Icon name={iconShare} size={14} color="#666" />
                <span style={{ marginLeft: '3px' }}>分享</span>
              </div>
            )
          }}
        />
        <Swipe
          class={styles.swipe}
          lazyRender
          v-slots={{
            indicator: (item: any) =>
              item.total > 1 && (
                <div class={styles['custom-indicator']}>
                  {(item.active || 0) + 1} / {item.total}
                </div>
              )
          }}
        >
          {this.albumPics.map((item: string, index: number) => (
            <SwipeItem>
              <Image
                class={styles.swipeItemImg}
                src={item}
                onClick={() => this.onPreview(index)}
                fit="cover"
              />
            </SwipeItem>
          ))}
        </Swipe>

        <CellGroup border={false} class={[styles.goodsHead, 'mb12']}>
          <Cell
            center
            border={false}
            v-slots={{
              title: () => (
                <div class={styles.priceGroup}>
                  <span class={styles.price}>
                    <i>¥</i>
                    {moneyFormat(this.getPrice)}
                  </span>
                  {/* <del class={styles.delPrice}>
                    ¥{moneyFormat(product.originalPrice)}
                  </del> */}
                </div>
              )
              // default: () => <div class={styles.stock}>销量4件</div>
            }}
          />
          <Cell
            center
            border={false}
            title={product.name}
            titleClass={[styles.goodsName, 'van-ellipsis']}
          />
        </CellGroup>

        <Row class={[styles.row, 'mb12']}>
          <Col span={4} class={styles.col}>
            规格
          </Col>
          <Col span={20}>
            {selectSku ? (
              <div class={styles.selectWrap}>
                {selectSku.stock <= 0
                  ? `当前款式暂时缺货`
                  : `已选择 ${selectSku.spDataJson}`}
              </div>
            ) : (
              <div>请选择 规格</div>
            )}
            <RadioGroup
              class={styles['radio-group']}
              modelValue={this.radio}
              onUpdate:modelValue={val => (this.radio = val)}
            >
              {this.skuStockList.map((item: any) => {
                const isActive = item.id === this.radio
                const type = isActive ? 'primary' : 'default'
                return (
                  <Badge
                    position="top-right"
                    content={item.stock <= 0 ? '缺货' : ''}
                    color={'#999999'}
                    class={styles.badge}
                    offset={[-20, 0]}
                  >
                    <Radio
                      class={styles.radio}
                      name={item.id}
                      disabled={item.stock <= 0}
                      onClick={() => {
                        // 判断是否有库存
                        if (item.stock <= 0) {
                          return
                        }
                        this.radio = item.id
                      }}
                    >
                      <Tag size="large" plain={isActive} type={type}>
                        {item.spDataJson}
                      </Tag>
                    </Radio>
                  </Badge>
                )
              })}
            </RadioGroup>
          </Col>
        </Row>
        {this.detailMobileHtml && (
          <div class={[styles.section]}>
            <div class={styles.detail}>
              <span>图文详情</span>
            </div>

            <div
              class={[styles.photoDetail, 'msgWrap']}
              onClick={this.onShowImg}
              v-html={this.detailMobileHtml}
            ></div>
          </div>
        )}

        {!this.loading && (
          <>
            <SubmitBar
              class={styles.actionBar}
              safe-area-inset-bottom
              v-slots={{
                button: () => (
                  <div class={styles.buyGroup}>
                    <ActionBarButton
                      type="primary"
                      class={styles.addCertBtn}
                      text="加入购物车"
                      disabled={this.platformStatus}
                      onClick={() => this.onShowCart()}
                    />
                    <ActionBarButton
                      type="primary"
                      text="立即购买"
                      disabled={this.platformStatus}
                      onClick={() => this.onShowCart('cartConfirm')}
                    />
                  </div>
                )
              }}
            >
              <Badge
                content={this.cartCount}
                showZero={false}
                onClick={() => {
                  if (this.platformStatus) {
                    return
                  }
                  this.$router.push('/cart')
                }}
              >
                <Icon
                  name={iconShopCart}
                  size={30}
                  class={this.platformStatus && styles.cartDisabled}
                />
              </Badge>
            </SubmitBar>
          </>
        )}
        <Popup
          show={this.addGoodsShow}
          closeable
          position="bottom"
          round
          onClose={() => {
            this.addGoodsShow = false
          }}
        >
          <AddGoodsCart
            show={this.addGoodsShow}
            onGetCartCount={() => this.getCartCount()}
            item={this.selectGoodsItem}
            defaultRadio={this.radio}
            showType={this.showType}
          />
        </Popup>

        <Popup
          style={{ background: 'transparent' }}
          show={this.shareShow}
          onClose={() => (this.shareShow = false)}
        >
          <ColShare
            shareUrl={this.shareUrl}
            teacherId={state.user.data.userId}
            shareType="mall"
          >
            <div class={styles.shareWrap}>
              <div class={styles.shareLeft}>
                <img
                  crossorigin="anonymous"
                  class={styles.sharePic}
                  src={sharePic}
                ></img>
              </div>
              <div class={styles.shareRight}>
                <div class={styles.shareShopTitle}>{this.product.name}</div>
                {selectSku ? (
                  <div class={styles.shareShopDes}>{selectSku.sku}</div>
                ) : null}
                <div class={styles.shareShopValue}>
                  <span class={styles.shareShopPrice}>
                    {moneyFormat(this.getPrice)}
                  </span>
                </div>
              </div>
              {/* <Card
                price={this.getPrice}
                desc={selectSku.sku}
                title={this.product.name}
                thumb={this.product.pic}
              /> */}
            </div>
          </ColShare>
        </Popup>
      </div>
    )
  }
})
