<template>
  <section class="AiDvTable">
    <el-table v-if="simple" class="simple" :data="tableData">
      <el-table-column v-for="item in columns" :key="item.prop" v-bind="item"/>
    </el-table>
    <div v-else class="aiDvTable" :class="'aiDvTable-' + theme + ' aiDvTable-' + size">
      <div class="header" :style="headerStyle">
      <span
          v-for="(item, index) in header"
          :key="index"
          :style="{
          width: config[index].width ? config[index].width + 'px' : '',
          textAlign: config[index].align,
          flex: config[index].width ? 'inherit' : 1
        }">
        {{ item.v }}
      </span>
      </div>
      <div class="body">
        <div class="row" v-for="(item, index) in body" :class="[stripe === '1' ? 'stripe' : '']" :key="index">
          <div
              v-for="(column, i) in item"
              :key="i"
              :style="{
            color: config[i].color,
            textAlign: config[i].align,
            fontSize: config[i].fontSize,
            width: config[i].width ? config[i].width + 'px' : '',
            flex: config[i].width ? 'inherit' : 1
          }">
            <i v-if="isShowIndex === '1' && i === 0">{{ index + 1 }}</i>
            <render-slot
                v-if="config[i].render"
                :render="config[i].render"
                :row="item"
                :column="column">
            </render-slot>
            <span v-else :title="column" @click="onClick(config[i], item)">{{ column }}</span>
          </div>
        </div>
      </div>
    </div>
  </section>
</template>

<script>
export default {
  name: 'AiDvTable',

  components: {
    renderSlot: {
      functional: true,
      props: {
        render: Function,
        column: {type: [String, Number]},
        row: {type: [Array, Object]},
      },
      render: (h, data) => {
        let params = {
          row: data.props.row
        }
        if (data.props.column) {
          params.column = data.props.column
        }
        return data.props.render(h, params)
      }
    }
  },

  props: {
    data: {
      type: Array,
      default: () => []
    },

    headerStyle: {
      type: Object,
      default: () => {
      }
    },

    isShowIndex: {
      type: String,
      default: '0'
    },

    stripe: {
      type: String,
      default: '1'
    },

    theme: {
      type: String,
      default: '0'
    },

    config: {
      type: Array,
      default: () => []
    },

    size: {
      type: String,
      default: 'small'
    },
    simple: Boolean
  },

  data() {
    return {
      header: [],
      body: []
    }
  },
  computed: {
    columns: v => v.header.map((e, i) => {
      let item = {}
      Object.values(e).forEach(label => {
        const {align} = v.config[i]
        item.align = align
        item.prop = `col${i}`
        item.label = label
      })
      return item
    }),
    tableData: v => v.body.map(arr => {
      const item = {}
      Object.values(arr).forEach((value, i) => {
        item[`col${i}`] = value
      })
      return item
    })
  },
  watch: {
    data: {
      handler(v) {
        this.init(v)
      },
      deep: true,
      immediate: true
    }
  },
  methods: {
    init(value) {
      if (!value.length) {
        this.header = []
        this.body = []

        return false
      }

      const headerKey = Object.keys(value[0])[0]
      const bodyKey = Object.keys(value[0]).filter(v => {
        return v !== headerKey
      })

      this.header = value.map(v => {
        return {
          v: v[headerKey]
        }
      })

      this.body = bodyKey.map(v => {
        return value.map(e => e[v])
      })
    },

    onClick(config, e) {
      if (config.click && typeof config.click === 'function') {
        return config.click.call(this, e)
      }
    },
  }
}
</script>

<style lang="scss" scoped>
@import "../../dv";

.aiDvTable {
  height: 100%;
  overflow: hidden;

  ::-webkit-scrollbar {
    width: 5px;
    height: 14px;
  }

  ::-webkit-scrollbar-corner {
    background: transparent;
  }

  ::-webkit-scrollbar-thumb {
    min-height: 20px;
    background-clip: content-box;
    box-shadow: 0 0 0 5px rgba(116, 148, 170, 0.5) inset;
  }

  ::-webkit-scrollbar-track {
    box-shadow: 1px 1px 5px rgba(116, 148, 170, 0.5) inset;
  }

  .header {
    display: flex;
    align-items: center;
    width: 100%;
    height: 40px;
    font-size: 16px;
    padding: 0 16px;
    color: rgba(255, 255, 255, 0.7);
    background: rgba(70, 70, 70, 0.35);

    span {
      flex: 1;
      text-align: center;
      overflow: hidden;
      white-space: nowrap;
      text-overflow: ellipsis;
      -o-text-overflow: ellipsis;

      &:first-child {
        text-align: left;
      }
    }
  }

  .body {
    height: calc(100% - 40px);
    padding: 10px 0;
    overflow-y: auto;
    box-sizing: border-box;

    .row {
      display: flex;
      align-items: center;
      width: 100%;
      height: 52px;
      padding: 0 16px;
      box-sizing: border-box;

      &.stripe:nth-of-type(2n) {
        background: rgba(48, 48, 48, 0.4);
      }

      div {
        display: flex;
        align-items: center;
        justify-content: center;
        flex: 1;
        font-size: 16px;
        text-align: center;
        color: #ffffff;
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
        -o-text-overflow: ellipsis;

        span {
          flex: 1;
          overflow: hidden;
          white-space: nowrap;
          text-overflow: ellipsis;
          -o-text-overflow: ellipsis;
        }

        i {
          width: 20px;
          height: 20px;
          line-height: 20px;
          margin-right: 10px;
          text-align: center;
          font-size: 12px;
          color: #18FEFE;
          font-style: normal;
          background: url(./asset/rankbg.png) no-repeat;
          background-size: 100% 100%;
        }

        &:first-child {
          justify-content: start;
          text-align: left;
        }
      }
    }
  }

  &.aiDvTable-mini {
    .header {
      height: 36px;
    }

    .row {
      height: 40px;
    }
  }

  &.aiDvTable-1 {
    ::-webkit-scrollbar {
      width: 5px;
      height: 14px;
    }

    ::-webkit-scrollbar-corner {
      background: transparent;
    }

    ::-webkit-scrollbar-thumb {
      min-height: 20px;
      background-clip: content-box;
      box-shadow: 0 0 0 5px rgba(250, 181, 108, 0.5) inset;
    }

    ::-webkit-scrollbar-track {
      box-shadow: 1px 1px 5px rgba(50, 181, 108, 0.5) inset;
    }

    .header {
      background: rgba(226, 121, 81, 0.2);
    }

    .body {
      div {
        i {
          color: #FFA086;
          background: url(./asset/rankbg-dj.png) no-repeat;
          background-size: 100% 100%;
        }
      }
    }
  }
}
</style>
