//package com.trs.digital.module.manager.service.digsearch.impl;
//
//import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.ct.reslib.dataobject.TableFieldDO;
//import com.ct.reslib.mapper.TableFieldMapper;
//import com.ct.reslib.mapper.rlTableMapper;
//import com.ct.reslib.scheduled.repository.IMetaDataCache;
//import com.ct.reslib.service.HyBaseService;
//import com.ct.reslib.service.RlTableService;
//import com.trs.hybase.client.*;
//import com.trs.hybase.client.params.SearchParams;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.jdbc.core.JdbcTemplate;
//import org.springframework.scheduling.annotation.Async;
//import org.springframework.stereotype.Service;
//
//import javax.annotation.Resource;
//import java.util.*;
//import java.util.stream.Collectors;
//
//@Service
//@Slf4j
//public class RlTableServiceImpl extends ServiceImpl<rlTableMapper, TableFieldDO> implements RlTableService {
//
//    @Resource
//    private TableFieldMapper tableFieldMapper;
//
//    @Resource
//    HyBaseService hyBaseService;
//
//    @Resource
//    JdbcTemplate jdbcTemplate;
//
//    @Autowired
//    IMetaDataCache metaDataCache;
//
//    @Value("${hybase.sync.datasource.url}")
//    private String dbUrl;
//
//    @Value("${hybase.sync.datasource.username}")
//    private String dbUsername;
//
//    @Value("${hybase.sync.datasource.password}")
//    private String dbPassword;
//
//    @Value("${hybase.dbname.rlPicture}")
//    private String rlPicture;
//
//    @Value("${hybase.dbname.rlAudio}")
//    private String rlAudio;
//
//    @Value("${hybase.dbname.rlVideo}")
//    private String rlVideo;
//
//    @Override
//    @Deprecated
//    public void createDB() throws TRSException {
//        TRSConnection conn = hyBaseService.connection();
//        if (conn == null) {
//            throw new TRSException("连接hyBase失败");
//        }
//        // 获取现有数据库名称
//        Set<String> existingDBNames = Arrays.stream(conn.getDatabases()) // 获取数据库列表
//                .map(TRSDatabase::getName) // 获取数据库名称
//                .flatMap(name -> Arrays.stream(name.split("system."))) // 拆分数据库名称
//                .collect(Collectors.toSet()); // 收集为Set集合
//        // 构建表名与列名的映射关系
//        Map<String, List<String>> tableColumnsMap = metaDataCache.MetaDataCacheList();
//        // 创建数据库
//        tableColumnsMap.forEach((tableName, columnNames) -> {
//            // 检查数据库是否已经存在
//            if (!existingDBNames.contains(tableName)) {
//                System.out.println("数据库 " + tableName + " 已存在，跳过创建");
//                return; // 如果数据库已经存在，则跳过创建
//            }
//            try {
//                synCreateTableToHyBase(tableName, columnNames); // 创建数据库
//            } catch (TRSException e) {
//                e.printStackTrace();
//            }
//        });
//        conn.close(); // 关闭数据库连接
//    }
//
//    @Override
//    public void rebuildCache() {
//        metaDataCache.deleteMap();
//        Map<String, List<String>> tableColumnsMap = buildTableColumnMapping();
//        metaDataCache.save(tableColumnsMap);
//    }
//    // 构建表名与列名的映射关系
//    public Map<String, List<String>> buildTableColumnMapping() {
//        TenantContextHolder.setTenantId(1L);
//        Map<String, List<String>> tableColumnsMap =
//                tableFieldMapper.selectList().stream()
//                        .collect(Collectors.groupingBy(TableFieldDO::getTableName, // 根据表名分组
//                                Collectors.mapping(TableFieldDO::getFieldName, Collectors.toList()))); // 映射为列名列表
//        // 查询表的列名并添加到映射关系中
//        String[] tables = {rlPicture, rlAudio, rlVideo}; // 图片表，音频表，视频表 (该些表不在元数据中，需要手动添加)
//        String sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ?";
//        Arrays.stream(tables)
//                .forEach(table -> {
//                    List<String> columnList = jdbcTemplate.queryForList(sql, table).stream()
//                            .map(row -> (String) row.get("COLUMN_NAME")) // 提取列名
//                            .filter(column -> !column.equals("id")) // 过滤掉"id"列
//                            .collect(Collectors.toList()); // 收集为列表
//                    tableColumnsMap.put(table, columnList); // 添加到映射关系中
//                });
//        return tableColumnsMap;
//    }
//
//    @Override
//    @Deprecated
//    public void rlList() {
//        // 构建表名与列名的映射关系
//        Map<String, List<String>> tableColumnsMap = metaDataCache.MetaDataCacheList();
//        // 遍历所有表名集合
//        tableColumnsMap.forEach((tableName, columnNames) -> {
//            try {
//                // 将每个表数据同步到 HyBase 中对应的表中
//                syncTableDataToHyBase(tableName, columnNames);
//            } catch (TRSException e) {
//                e.printStackTrace();
//            }
//        });
//        log.info("HyBase数据同步完成");
//    }
//
//    @Override
//    public void rlListDelete(String fnName) throws TRSException {
//        TRSConnection conn = hyBaseService.connection();
//        if (conn == null) {
//            throw new TRSException("连接hyBase失败!");
//        }
//        conn.deleteDatabase(fnName);
//    }
//
//    @Override
//    public void rlListUpdate(String fnName, String fnOld, String fnNew) throws TRSException {
//        TRSConnection conn = hyBaseService.connection();
//        SearchParams param = new SearchParams();
//        List<TableFieldDO> tableFieldDOS = tableFieldMapper.selectList();
//        List<TRSInputRecord> newValues = new ArrayList<TRSInputRecord>();
//        String s = "";
//        TRSResultSet rs = null;
//        for (TableFieldDO tableFieldDO : tableFieldDOS) {
//            param.setReadColumns(tableFieldDO.getFieldName());
//            rs = conn.executeSelect(fnName, "fn_id:" + tableFieldDO.getTableId(), 0, 100, param);
//            for (int i = 0; i < rs.size(); i++) {
//                if (tableFieldDO.getUpdater().equals("1")) {
//                    rs.moveNext();
//                    TRSRecord trsRecord = rs.get();
//                    TRSInputRecord record = new TRSInputRecord();
//                    record.setUid(trsRecord.getUid());
//                    record.addColumn(fnOld, fnNew);
//                    newValues.add(record);
//                }
//            }
//            s = fnName;
//        }
//        conn.executeUpdate(s, newValues);
//    }
//
//    @Override
//    @Async("asyncHyBaseTableList")
//    public void updateTableList(Long metaId, String tableName) throws TRSException {
//        // 删除表
//        log.info("删除表结构:{}", tableName);
//        rlListDelete(tableName);
//        // 添加表
//        log.info("添加表结构:{}", tableName);
//        // 获取表名称对应的元数据列
//        List<String> columnList = (metaId != null && metaId == 0L) ?
//                new ArrayList<>(metaDataCache.MetaDataCacheList().get(tableName)) :
//                tableFieldMapper.selectTableName(metaId, tableName).stream()
//                        .map(TableFieldDO::getFieldName)
//                        .filter(column -> !column.equals("id"))
//                        .collect(Collectors.toList());
//        // 创建数据库对象
//        synCreateTableToHyBase(tableName, columnList);
//        // 将单表数据同步到hybase所对应tableName表中
//        log.info("开始添加表数据到:{}", tableName);
//        syncTableDataToHyBase(tableName, columnList);
//    }
//
//    // 创建表同步
//    public void synCreateTableToHyBase(String tableName, List<String> columnList) throws TRSException {
//        TRSConnection conn = hyBaseService.connection();
//        if (conn == null) {
//            throw new TRSException("连接hyBase失败");
//        }
//        TRSDatabase db = new TRSDatabase(tableName, TRSDatabase.TYPE_VIEW, TRSDatabase.DBPOLICY.FASTEST);
//        db.addColumn(new TRSDatabaseColumn("id", TRSDatabaseColumn.TYPE_CHAR));
//        for (String columnName : columnList) {
//            TRSDatabaseColumn column = columnName.equals("fn_pubdate") || columnName.equals("create_time")
//                    ? new TRSDatabaseColumn(columnName, TRSDatabaseColumn.TYPE_DATE)
//                    : new TRSDatabaseColumn(columnName, TRSDatabaseColumn.TYPE_PHRASE);
//            db.addColumn(column);
//        }
//        db.setUniqueColumn("id");
//        // 创建数据库
//        conn.createDatabase(db);
//        log.info("表结构完成:{}", tableName);
//    }
//
//    // 将单表数据同步到hybase所对应tableName表中
//    @Deprecated
//    public void syncTableDataToHyBase(String tableName, List<String> columnList) throws TRSException {
////        TRSConnection conn = hyBaseService.connection();
////        if (conn == null) {
////            throw new TRSException("连接hyBase失败");
////        }
////        try {
////            Connection con = DriverManager.getConnection(dbUrl, dbUsername, dbPassword);
////            // 查询tableName数据库中所有数据
////            String sql = "SELECT * FROM " + tableName + " WHERE deleted = 0";
////            PreparedStatement statement = con.prepareStatement(sql);
////            ResultSet resultSet = statement.executeQuery();
////            // 遍历查询结果
////            while (resultSet.next()) {
////                TRSInputRecord allRecords = new TRSInputRecord();  // 在结果集循环内部创建对象
////                // 获取结果集的元数据，用于获取关于结果集的信息
////                ResultSetMetaData metaData = resultSet.getMetaData();
////                int columnCount = metaData.getColumnCount();
////                // 添加id列
////                String id = resultSet.getString("id");
////                String uuid = IdUtil.fastSimpleUUID();
////                allRecords.addColumn("id", id != null && !id.isEmpty() ? id : uuid);
////                // 遍历结果集的列
////                for (int i = 1; i <= metaData.getColumnCount(); i++) {
////                    String columnName = metaData.getColumnLabel(i); // 获取当前列的列名
////                    // 如果当前列名在指定的列名列表中，则添加该列的值到记录对象中
////                    if (columnList.contains(columnName)) {
////                        allRecords.addColumn(columnName, resultSet.getString(columnName));
////                    }
////                }
////                // 在循环内部插入每条记录的数据
////                conn.executeInsert(tableName, Arrays.asList(allRecords));
////            }
////            resultSet.close();
////            statement.close();
////            log.info("更新完成:{}", tableName);
////        } catch (Exception e) {
////            e.printStackTrace();
////        } finally {
////            if (conn != null) {
////                conn.close();
////            }
////        }
//    }
//}
