<script setup>
import { ref, onMounted } from "vue";
import Container from "@/components/Container.vue";
import SModal from "@/components/SModal.vue";
import EditOption from "@/components/EditOption.vue";
import PointRecord from "@/components/PointRecord.vue";
import ScrollList from "@/components/ScrollList.vue";
import ScreenHint2 from "@/components/ScreenHint2.vue";
import { getPointBookListAPI, removePointRecord } from "@/apis";

const showTip = ref(false);
const bowType = ref({});
const distance = ref(0);
const bowtargetType = ref({});
const showModal = ref(false);
const selectorIndex = ref(0);
const list = ref([]);
const removeId = ref("");

const onListLoading = async (page) => {
  const result = await getPointBookListAPI(
    page,
    bowType.value.id,
    distance.value,
    bowtargetType.value.id
  );
  if (page === 1) {
    list.value = result;
  } else {
    list.value = list.value.concat(result);
  }
  return result.length;
};

const openSelector = (index) => {
  selectorIndex.value = index;
  showModal.value = true;
};

const onRemoveRecord = (item) => {
  removeId.value = item.id;
  showTip.value = true;
};

const confirmRemove = async () => {
  try {
    showTip.value = false;
    await removePointRecord(removeId.value);
    list.value = list.value.filter((it) => it.id !== removeId.value);
    uni.showToast({ title: "Deleted", icon: "none" });
  } catch (e) {
    uni.showToast({ title: "Delete failed, please retry", icon: "none" });
  }
};

const onSelectOption = (itemIndex, value) => {
  if (itemIndex === 0) {
    bowType.value = value.name === bowType.value.name ? {} : value;
  } else if (itemIndex === 1) {
    distance.value = value === distance.value ? 0 : value;
  } else if (itemIndex === 2) {
    bowtargetType.value = value.name === bowtargetType.value.name ? {} : value;
  }
  showModal.value = false;
  onListLoading(1);
};
</script>

<template>
  <Container
    :bgType="2"
    bgColor="#F5F5F5"
    :whiteBackArrow="false"
    title="Point Records"
  >
    <view class="container">
      <view class="selectors">
        <view @click="() => openSelector(0)">
          <text :style="{ color: bowType.name ? '#000' : '#999' }">{{
            bowType.name || "Please select"
          }}</text>
          <image src="../static/arrow-grey.png" mode="widthFix" />
        </view>
        <view @click="() => openSelector(1)">
          <text :style="{ color: distance ? '#000' : '#999' }">{{
            distance ? distance + " m" : "Please select"
          }}</text>
          <image src="../static/arrow-grey.png" mode="widthFix" />
        </view>
        <view @click="() => openSelector(2)">
          <text :style="{ color: bowtargetType.name ? '#000' : '#999' }">{{
            bowtargetType.name || "Please select"
          }}</text>
          <image src="../static/arrow-grey.png" mode="widthFix" />
        </view>
      </view>
      <view class="point-records">
        <ScrollList :onLoading="onListLoading">
          <view v-for="(item, index) in list" :key="item.id">
            <PointRecord :data="item" :onRemove="onRemoveRecord" />
            <view v-if="index < list.length - 1" :style="{ height: '25rpx' }"></view>
          </view>
          <view class="no-data" v-if="list.length === 0">No data</view>
        </ScrollList>
      </view>
      <SModal
        :show="showModal"
        :noBg="true"
        height="auto"
        :onClose="() => (showModal = false)"
      >
        <view class="selector">
          <button hover-class="none" @click="() => (showModal = false)">
            <image src="../static/close-grey.png" mode="widthFix" />
          </button>
          <EditOption
            v-show="selectorIndex === 0"
            :itemIndex="0"
            :expand="true"
            :noArrow="true"
            :onSelect="onSelectOption"
            :value="bowType.name"
          />
          <EditOption
            v-show="selectorIndex === 1"
            :itemIndex="1"
            :expand="true"
            :noArrow="true"
            :onSelect="onSelectOption"
            :value="distance + ''"
          />
          <EditOption
            v-show="selectorIndex === 2"
            :itemIndex="2"
            :expand="true"
            :noArrow="true"
            :onSelect="onSelectOption"
            :value="bowtargetType.name"
          />
        </view>
      </SModal>
      <ScreenHint2 :show="showTip">
        <view class="tip-content">
          <text>Are you sure to delete this record?</text>
          <view>
            <button hover-class="none" @click="showTip = false">Cancel</button>
            <button hover-class="none" @click="confirmRemove">Confirm</button>
          </view>
        </view>
      </ScreenHint2>
    </view>
  </Container>
</template>

<style scoped>
.container {
  width: 100%;
  height: 100%;
}
.selectors {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 15px;
  margin-top: 10px;
}
.selectors > view {
  display: flex;
  align-items: center;
  justify-content: space-between;
  background-color: #fff;
  height: 55px;
  border-radius: 12px;
  color: #333;
  font-size: 13px;
  width: 26vw;
}
.selectors > view:last-child {
  width: 34vw;
}
.selectors > view > text {
  width: calc(100% - 11vw);
  text-align: center;
  margin-left: 3vw;
}
.selectors > view > image {
  width: 5vw;
  margin-right: 3vw;
}
.selector {
  padding: 10px;
  background-color: #fff;
  border-radius: 10px;
  position: relative;
}
.selector > button {
  position: absolute;
  top: 0;
  right: 0;
}
.selector > button > image {
  width: 40px;
}
.point-records {
  margin: 0 15px;
  margin-top: 10px;
  height: calc(100% - 80px);
}
.no-data {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  color: #999999;
  font-size: 14px;
}
.tip-content {
  width: 100%;
  padding: 25px;
  display: flex;
  flex-direction: column;
  color: #000;
}
.tip-content > text {
  width: 100%;
  text-align: center;
  font-size: 14px;
  margin-top: 5px;
}
.tip-content > view {
  display: flex;
  justify-content: space-between;
  margin-top: 20px;
}
.tip-content > view > button {
  width: 48%;
  background: linear-gradient(180deg, #fbfbfb 0%, #f5f5f5 100%);
  border-radius: 22px;
  border: 1px solid #eeeeee;
  padding: 12px 0;
  font-size: 14px;
  color: #000;
}
.tip-content > view > button:last-child {
  background: #fed847;
}
</style>
