<template>
  <div class="main-content">
    <div class="left">
      <!-- <div class="select-box">
					<div class="select-box-header">
						<div class="icon"></div>
						<div class="title">{{ "报告类型" }}</div>
					</div>
					<div class="select-main">
						<div class="checkbox-group">
							<el-checkbox v-for="type in reportTypeList" :key="type.id" v-model="selectedReportTypeList"
								:label="type.id" class="filter-checkbox" @change="handleGetThinkDynamicsReport()">
								{{ type.typeName }}
							</el-checkbox>
						</div>
					</div>
				</div> -->
      <div class="select-research-box">
        <div class="select-box-header">
          <div class="icon"></div>
          <div class="title">{{ "科技领域" }}</div>
        </div>
        <div class="select-main">
          <el-checkbox-group class="checkbox-group" :model-value="selectedResearchIds" @change="handleAreaGroupChange">
            <el-checkbox class="filter-checkbox" :label="RESOURCE_FILTER_ALL_AREA">
              {{ RESOURCE_FILTER_ALL_AREA }}
            </el-checkbox>
            <el-checkbox v-for="type in researchTypeList" :key="type.id" class="filter-checkbox" :label="type.id">
              {{ type.name }}
            </el-checkbox>
          </el-checkbox-group>
        </div>
      </div>
      <div class="select-time-box">
        <div class="select-box-header">
          <div class="icon"></div>
          <div class="title">{{ "发布时间" }}</div>
        </div>
        <div class="select-main">
          <el-checkbox-group class="checkbox-group" :model-value="selectedResearchTimeIds"
            @change="handleTimeGroupChange">
            <el-checkbox class="filter-checkbox" :label="RESOURCE_FILTER_ALL_TIME">
              {{ RESOURCE_FILTER_ALL_TIME }}
            </el-checkbox>
            <el-checkbox v-for="type in researchTimeList" :key="type.id" class="filter-checkbox" :label="type.id">
              {{ type.name }}
            </el-checkbox>
          </el-checkbox-group>
        </div>
        <!-- <div class="input-main">
						<el-input placeholder="输入作者名字" v-model="author" @input="handleGetThinkDynamicsReport()" />
					</div> -->
      </div>
    </div>
    <div class="right" v-loading="loading">
      <div class="card-box">
        <template v-if="hasData">
          <div class="footer-card" v-for="(item, index) in curFooterList" :key="index"
            @click="handleToReportDetail(item)">
            <div class="footer-card-top">
              <img :src="item.imageUrl" alt="" />
            </div>
            <div class="footer-card-title">
              <span v-html="highlightText(item.name)"></span>
            </div>
            <div class="footer-card-footer">
              <div class="time">{{ formatDate(item.times) }}</div>
              <div class="from">{{ item.thinkTankName }}</div>
            </div>
          </div>
        </template>
        <template v-else-if="!loading">
          <div class="right-empty">
            <el-empty class="right-el-empty" description="暂无数据" :image-size="100" />
          </div>
        </template>
      </div>
      <div class="right-footer">
        <div class="info">
          共 {{ total }} 篇智库报告
        </div>
        <div class="page-box">
          <el-pagination :page-size="12" :page-count="pageCount" background layout="prev, pager, next"
            @current-change="handleCurrentChange" :current-page="currentPage" />
        </div>
      </div>
    </div>
  </div>
</template>
<script setup>
import { ref, toRefs, watch, computed } from "vue";
import {
  RESOURCE_FILTER_ALL_AREA,
  RESOURCE_FILTER_ALL_TIME,
  normalizeExclusiveAllOption,
  stripAllAreaForRequest,
  stripAllTimeForRequest
} from "../../../utils/resourceLibraryFilters";
const formatDate = (str) => {
  if (!str) return ''
  const [y, m, d] = str.split('T')[0].split('-')
  return `${y}年${+m}月${+d}日`
};
const props = defineProps({
  researchTypeList: {
    type: Array,
    default: () => []
  },
  researchTimeList: {
    type: Array,
    default: () => []
  },
  selectedFilters: {
    type: Object,
    default: () => ({
      researchTypeIds: [],
      researchTimeIds: [],
      researchHearingIds: []
    })
  },
  curFooterList: {
    type: Array,
    default: () => []
  },
  total: {
    type: Number,
    default: 0
  },
  currentPage: {
    type: Number,
    default: 1
  },
  searchKeyword: {
    type: String,
    default: ""
  },
  loading: {
    type: Boolean,
    default: false
  }
});

const emit = defineEmits([
  "update:selectedFilters",
  "filter-change",
  "page-change",
  "report-click"
]);

// 解构 props，保持模板里变量名不变
const { researchTypeList, researchTimeList, curFooterList, total, currentPage } = toRefs(props);
const hasData = computed(() => Array.isArray(curFooterList.value) && curFooterList.value.length > 0);
const pageCount = computed(() => {
  const size = 12;
  const t = Number(total.value || 0) || 0;
  return Math.max(1, Math.ceil(t / size));
});

const selectedResearchIds = ref([RESOURCE_FILTER_ALL_AREA]);
const selectedResearchTimeIds = ref([RESOURCE_FILTER_ALL_TIME]);

const escapeHtml = (text) => {
  return String(text ?? "")
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#39;");
};

const escapeRegExp = (text) => {
  return String(text ?? "").replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
};

const highlightText = (text) => {
  const safeText = escapeHtml(text);
  const keyword = (props.searchKeyword || "").trim();
  if (!keyword) return safeText;
  const pattern = new RegExp(`(${escapeRegExp(keyword)})`, "gi");
  return safeText.replace(pattern, '<span class="keyword-highlight">$1</span>');
};

// 父组件更新时同步到子组件（接口层无选中时为「全部」）
watch(
  () => props.selectedFilters,
  val => {
    selectedResearchIds.value =
      val?.researchTypeIds?.length > 0
        ? [...val.researchTypeIds]
        : [RESOURCE_FILTER_ALL_AREA];
    selectedResearchTimeIds.value =
      val?.researchTimeIds?.length > 0
        ? [...val.researchTimeIds]
        : [RESOURCE_FILTER_ALL_TIME];
  },
  { immediate: true, deep: true }
);

const buildSelectedFiltersPayload = () => ({
  researchTypeIds: stripAllAreaForRequest(selectedResearchIds.value),
  researchTimeIds: stripAllTimeForRequest(selectedResearchTimeIds.value),
  researchHearingIds: []
});

const handleAreaGroupChange = (val) => {
  selectedResearchIds.value = normalizeExclusiveAllOption(val, RESOURCE_FILTER_ALL_AREA);
  handleGetThinkDynamicsReport();
};

const handleTimeGroupChange = (val) => {
  selectedResearchTimeIds.value = normalizeExclusiveAllOption(val, RESOURCE_FILTER_ALL_TIME);
  handleGetThinkDynamicsReport();
};

// 保持模板里的方法名不变，但改成通知父组件，直接传入当前选中值避免时序问题
const handleGetThinkDynamicsReport = () => {
  const payload = buildSelectedFiltersPayload();
  emit("update:selectedFilters", payload);
  emit("filter-change", payload);
};

const handleCurrentChange = page => {
  emit("page-change", page);
};

const handleToReportDetail = item => {
  emit("report-click", item);
};
</script>
<style lang="scss" scoped>
/* 统一智库动态智库报告内所有 el-checkbox 文本为 16px */
:deep(.el-checkbox__label) {
  font-size: 16px;
}

.main-content {
  display: flex;
  gap: 16px;
  margin-bottom: 80px;

  .left {
    width: 360px;
    height: 100%;
    padding-bottom: 24px;
    box-sizing: border-box;
    border: 1px solid rgba(234, 236, 238, 1);
    border-radius: 10px;
    box-shadow: 0px 0px 20px 0px rgba(94, 95, 95, 0.1);
    background: rgba(255, 255, 255, 1);
    position: relative;

    .select-research-box {
      width: 360px;
      height: 100%;
      margin-top: 16px;

      .select-box-header {
        display: flex;
        gap: 17px;
        margin-bottom: 12px;

        .icon {
          margin-top: 4px;
          width: 8px;
          height: 16px;
          background: var(--color-main-active);
          border-radius: 0 4px 4px 0;
        }

        .title {
          height: 26px;
          color: var(--color-main-active);
          font-family: "Source Han Sans CN";
          font-size: 16px;
          font-weight: 700;
          line-height: 24px;
          letter-spacing: 1px;
          text-align: left;
        }
      }

      .select-main {

        margin-left: 24px;

        .checkbox-group {
          display: grid;
          grid-template-columns: repeat(2, 160px);
          gap: 8px 4px;

          .filter-checkbox {
            width: 160px;
            height: 24px;

          }
        }

      }

      .select-main1 {
        width: 100px;
      }

      .input-main {
        margin: 10px auto;
        width: 250px;
        height: 34px;
        border-radius: 10px;
        border: 1px solid rgba(230, 231, 232, 1);
      }
    }

    .select-time-box {
      margin-top: 16px;
      width: 360px;
      height: 100%;

      .select-box-header {
        display: flex;
        gap: 17px;
        margin-bottom: 12px;

        .icon {
          margin-top: 4px;
          width: 8px;
          height: 16px;
          background: var(--color-main-active);
          border-radius: 0 4px 4px 0;
        }

        .title {
          height: 26px;
          color: var(--color-main-active);
          font-family: "Source Han Sans CN";
          font-size: 16px;
          font-weight: 700;
          line-height: 24px;
          letter-spacing: 1px;
          text-align: left;
        }
      }

      .select-main {

        margin-left: 24px;

        .checkbox-group {
          display: grid;
          grid-template-columns: repeat(2, 160px);
          gap: 8px 4px;

          .filter-checkbox {
            width: 160px;
            height: 24px;
          }

        }

      }

      .select-main1 {
        width: 100px;
      }

      .input-main {
        margin: 10px auto;
        width: 250px;
        height: 34px;
        border-radius: 10px;
        border: 1px solid rgba(230, 231, 232, 1);
      }
    }
  }

  :deep(.keyword-highlight) {
    background-color: #fff59d;
  }

  .right {
    width: 1284px;
    display: flex;
    flex-direction: column;


    .card-box {
      flex: 1;

      display: flex;

      flex-wrap: wrap;
      gap: 13px;

      .right-empty {
        width: 100%;
        flex: 1;
        display: flex;
        align-items: center;
        justify-content: center;
        padding: 24px;
      }

      .footer-card {
        width: 398px;
        height: 300px;
        border-radius: 10px;
        box-shadow: 0px 0px 20px 0px rgba(25, 69, 130, 0.1);
        background: rgba(255, 255, 255, 1);
        transition: transform 0.3s ease, box-shadow 0.3s ease;
        position: relative;

        &:hover {
          transform: translateY(-3px);
          box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
        }

        cursor: pointer;

        .footer-card-top {
          width: 364px;
          height: 180px;
          margin: 0 auto;
          margin-top: 15px;
          position: relative;

          img {
            width: 100%;
            height: 100%;
          }
        }

        .footer-card-title {
          margin: 0 auto;
          margin-top: 12px;
          width: 360px;

          color: rgb(59, 65, 75);
          font-family: "Source Han Sans CN";
          font-size: 18px;
          font-weight: 700;
          line-height: 24px;
          // 多行省略 + 自动换行（兼容写法）
          overflow: hidden;
          text-overflow: ellipsis;
          display: -webkit-box; // webkit 私有：开启弹性盒模型
          display: box; // 标准写法（兜底）
          -webkit-line-clamp: 2; // webkit 私有：限制行数
          line-clamp: 2; // 标准属性：解决兼容性提示
          -webkit-box-orient: vertical; // webkit 私有：垂直排列
          box-orient: vertical; // 标准写法（兜底）

          // 基础换行属性（确保文字能换行）
          word-wrap: break-word;
          word-break: break-all;
          white-space: normal;

        }

        .footer-card-footer {
          position: absolute;
          left: 50%;
          bottom: 15px;
          transform: translateX(-50%);
          margin: 0;
          width: 360px;
          height: 22px;
          display: flex;
          justify-content: space-between;
          color: rgb(95, 101, 108);
          font-family: "Source Han Sans CN";
          font-size: 14px;
          font-weight: 400;
          line-height: 22px;
        }
      }
    }

    .right-footer {
      margin-top: 35px;
      display: flex;
      justify-content: space-between;

      .info {
        height: 19px;
        color: rgb(132, 136, 142);
        font-family: Microsoft YaHei;
        font-size: 14px;
        font-weight: 400;
        line-height: 18px;
        letter-spacing: 0px;
        text-align: left;
      }
    }
  }
}

:deep(.el-checkbox) {
  margin-right: 0 !important;

}
</style>