package license_cache

// import (
// 	"database/sql"
// 	"fmt"
// 	"sort"
// 	"sync"
// 	"time"
// )

// type CacheLicenseInfo struct {
// 	ID                     sql.NullInt32  `json:"id"`
// 	UniqueID               sql.NullString `json:"unique_id"`
// 	OARequestID            sql.NullInt64  `json:"oa_request_id"`
// 	OARequestName          sql.NullString `json:"oa_request_name"`
// 	OARequestNameNew       sql.NullString `json:"oa_request_name_new"`
// 	OARequestNameHTMLNew   sql.NullString `json:"oa_request_name_html_new"`
// 	OAGLXMId               sql.NullInt64  `json:"oa_glxmid"`
// 	OAGLXMName             sql.NullString `json:"oa_glxmname"`
// 	OASQSJ                 sql.NullTime   `json:"oa_sqsj"`
// 	OASalespersonName      sql.NullString `json:"oa_salesperson_name"`
// 	OAXSJSYX               sql.NullString `json:"oa_xsjsyx"`
// 	OAOperationsPersonName sql.NullString `json:"oa_operations_person_name"`
// 	OAJFJSYX               sql.NullString `json:"oa_jfjsyx"`
// 	OASYDW                 sql.NullString `json:"oa_sydw"`
// 	OAXMXXMS               sql.NullString `json:"oa_xmxxms"`
// 	OAJDS                  sql.NullInt64  `json:"oa_jds"`
// 	OANodeCount            sql.NullInt64  `json:"oa_node_count"`
// 	OAProductCode          sql.NullString `json:"oa_product_code"`
// 	OAProductName          sql.NullString `json:"oa_product_name"`
// 	OAProductVersion       sql.NullString `json:"oa_product_version"`
// 	OACPU                  sql.NullString `json:"oa_cpu"`
// 	OAOperatingSystem      sql.NullString `json:"oa_operating_system"`
// 	OAMainMAC              sql.NullString `json:"oa_main_mac"`
// 	OASecondMAC            sql.NullString `json:"oa_second_mac"`
// 	OACreationDate         sql.NullString `json:"oa_creation_date"`
// 	OACreationTime         sql.NullString `json:"oa_creation_time"`
// 	OALastOperateDate      sql.NullString `json:"oa_last_operate_date"`
// 	OALastOperateTime      sql.NullString `json:"oa_last_operate_time"`
// 	CaptureTime            sql.NullTime   `json:"capture_time"`
// 	DelTime                sql.NullTime   `json:"del_time"`
// 	LastOperateTime        sql.NullTime   `json:"last_operate_time"`

// 	// Fields from License_generate_Info table
// 	LicenseID       sql.NullInt32  `json:"license_id"`
// 	LicenseUniqueID sql.NullString `json:"license_unique_id"`
// 	LicenseFlage    sql.NullString `json:"license_flage"`
// 	Lic1            sql.NullString `json:"lic1"`
// 	Lic2            sql.NullString `json:"lic2"`
// 	CreatorGenerate sql.NullString `json:"creator_generate"`
// }

// type Cache struct {
// 	mutex    sync.RWMutex
// 	data     map[int64][]CacheLicenseInfo
// 	total    int
// 	lastLoad time.Time
// }

// // NewCache 初始化缓存
// func NewCache() *Cache {
// 	return &Cache{
// 		data:     make(map[int64][]CacheLicenseInfo),
// 		total:    0,
// 		lastLoad: time.Now(),
// 	}
// }

// func (c *Cache) GetTotal() int {
// 	return c.total
// }

// func (c *Cache) GetData() map[int64][]CacheLicenseInfo {
// 	return c.data
// }

// // 刷新缓存
// func (c *Cache) RefreshCache(db *sql.DB, startTime, endTime time.Time, offset, limit int) error {
// 	c.data = make(map[int64][]CacheLicenseInfo)
// 	if err := c.LoadDataFromDB(db, startTime, endTime, offset, limit); err != nil {
// 		return err
// 	}

// 	return nil
// }

// // LoadDataFromDB 从数据库加载数据
// /*    SELECT
//             la.ID, la.Unique_ID, la.OA_REQUESTID, la.OA_REQUESTNAME, la.OA_REQUESTNAMENEW,
//             la.OA_REQUESTNAMEHTMLNEW,
// 			la.OA_GLXMID ,la.OA_GLXMNAME,
// 			la.OA_SQSJ, la.OA_SALESPERSONNAME, la.OA_XSJSYX,
//             la.OA_OPERATIONSPERSONNAME, la.OA_JFJSYX, la.OA_SYDW, la.OA_XMXXMS, la.OA_JDS,
//             la.OA_NODECOUNT, la.OA_PRODUCTCODE, la.OA_PRODUCTNAME, la.OA_PRODUCTVERSION,
//             la.OA_CPU, la.OA_OPERATINGSYSTEM, la.OA_MAINMAC, la.OA_SECONDMAC, la.OA_CREATIONDATE,
//             la.OA_CREATIONTIME, la.OA_LASTOPERATEDATE, la.OA_LASTOPERATETIME, la.capture_Time,
//             la.del_Time, la.LAST_OPERATE_TIME,
//             li.ID AS License_ID, li.License_UniqueID, li.License_Flage, li.lic1, li.lic2, li.Creator_generate
//         FROM
//             target_OA_license la
//         INNER JOIN
//             License_generate_Info li
//         ON
//             la.Unique_ID = li.License_UniqueID
//         WHERE TO_TIMESTAMP(la.OA_CREATIONDATE || ' ' || la.OA_CREATIONTIME, 'YYYY-MM-DD HH24:MI:SS') > TO_TIMESTAMP(?, 'YYYY-MM-DD HH24:MI:SS')
// 		and la.del_Time IS NULL

//         LIMIT ? OFFSET ?*/
// func (c *Cache) LoadDataFromDB(db *sql.DB, startTime, endTime time.Time, offset, limit int) error {
// 	c.mutex.Lock()
// 	defer c.mutex.Unlock()

// 	query := `
//     SELECT     la.ID, la.Unique_ID, la.OA_REQUESTID, la.OA_REQUESTNAME, la.OA_REQUESTNAMENEW,
//             la.OA_REQUESTNAMEHTMLNEW,
// 			la.OA_GLXMID ,la.OA_GLXMNAME,
// 			la.OA_SQSJ, la.OA_SALESPERSONNAME, la.OA_XSJSYX,
//             la.OA_OPERATIONSPERSONNAME, la.OA_JFJSYX, la.OA_SYDW, la.OA_XMXXMS, la.OA_JDS,
//             la.OA_NODECOUNT, la.OA_PRODUCTCODE, la.OA_PRODUCTNAME, la.OA_PRODUCTVERSION,
//             la.OA_CPU, la.OA_OPERATINGSYSTEM, la.OA_MAINMAC, la.OA_SECONDMAC, la.OA_CREATIONDATE,
//             la.OA_CREATIONTIME, la.OA_LASTOPERATEDATE, la.OA_LASTOPERATETIME, la.capture_Time,
//             la.del_Time, la.LAST_OPERATE_TIME,
//             li.ID AS License_ID, li.License_UniqueID, li.License_Flage, li.lic1, li.lic2, li.Creator_generate
// FROM SYSDBA.TARGET_OA_LICENSE  la
// INNER JOIN
// 			License_generate_Info li
// 		ON
// 			la.Unique_ID = li.License_UniqueID
// 		WHERE OA_REQUESTID IN(SELECT OA_REQUESTID FROM (SELECT DISTINCT OA_REQUESTID FROM TARGET_OA_LICENSE) a
// 								WHERE ROWNUM BETWEEN ? AND ?)
// 		AND la.del_Time IS NULL

//     `

// 	rows, err := db.Query(query, offset, limit)
// 	if err != nil {
// 		return err
// 	}
// 	defer rows.Close()

// 	for rows.Next() {
// 		var record CacheLicenseInfo
// 		err := rows.Scan(
// 			&record.ID,
// 			&record.UniqueID,
// 			&record.OARequestID,
// 			&record.OARequestName,
// 			&record.OARequestNameNew,
// 			&record.OARequestNameHTMLNew,
// 			&record.OAGLXMId,
// 			&record.OAGLXMName,
// 			&record.OASQSJ,
// 			&record.OASalespersonName,
// 			&record.OAXSJSYX,
// 			&record.OAOperationsPersonName,
// 			&record.OAJFJSYX,
// 			&record.OASYDW,
// 			&record.OAXMXXMS,
// 			&record.OAJDS,
// 			&record.OANodeCount,
// 			&record.OAProductCode,
// 			&record.OAProductName,
// 			&record.OAProductVersion,
// 			&record.OACPU,
// 			&record.OAOperatingSystem,
// 			&record.OAMainMAC,
// 			&record.OASecondMAC,
// 			&record.OACreationDate,
// 			&record.OACreationTime,
// 			&record.OALastOperateDate,
// 			&record.OALastOperateTime,
// 			&record.CaptureTime,
// 			&record.DelTime,
// 			&record.LastOperateTime,

// 			// Fields from License_generate_Info table
// 			&record.LicenseID,
// 			&record.LicenseUniqueID,
// 			&record.LicenseFlage,
// 			&record.Lic1,
// 			&record.Lic2,
// 			&record.CreatorGenerate,
// 		)
// 		if err != nil {
// 			return err
// 		}

// 		oaRequestID := record.OARequestID.Int64
// 		c.data[oaRequestID] = append(c.data[oaRequestID], record)
// 		c.total++
// 	}
// 	fmt.Println("data records loaded:", c.data)
// 	c.lastLoad = time.Now()
// 	return nil
// }

// // GetPaginatedData 获取分页数据并按 OALastOperateDate 和 OALastOperateTime 排序
// func (c *Cache) GetPaginatedData(page, pageSize int) (map[int64][]CacheLicenseInfo, error) {
// 	c.mutex.RLock()
// 	defer c.mutex.RUnlock()

// 	if c.total == 0 {
// 		return nil, fmt.Errorf("cache is empty")
// 	}

// 	allRecords := make([]CacheLicenseInfo, 0, c.total)
// 	for _, records := range c.data {
// 		allRecords = append(allRecords, records...)
// 	}

// 	sort.SliceStable(allRecords, func(i, j int) bool {
// 		if allRecords[i].OALastOperateDate.String != allRecords[j].OALastOperateDate.String {
// 			return allRecords[i].OALastOperateDate.String < allRecords[j].OALastOperateDate.String
// 		}
// 		return allRecords[i].OALastOperateTime.String < allRecords[j].OALastOperateTime.String
// 	})

// 	start := (page - 1) * pageSize
// 	if start >= len(allRecords) {
// 		return nil, fmt.Errorf("page out of range")
// 	}

// 	end := start + pageSize
// 	if end > len(allRecords) {
// 		end = len(allRecords)
// 	}

// 	result := [][]CacheLicenseInfo{}
// 	groupMap := make(map[int64][]CacheLicenseInfo)

// 	for _, record := range allRecords[start:end] {
// 		groupMap[record.OARequestID.Int64] = append(groupMap[record.OARequestID.Int64], record)
// 	}

// 	for _, group := range groupMap {
// 		result = append(result, group)
// 	}

// 	return groupMap, nil
// }

// // EnsureDataAvailability 确保缓存中有足够的数据
// func (c *Cache) EnsureDataAvailability(db *sql.DB, page, pageSize int, startTime, endTime time.Time) error {
// 	c.mutex.RLock()
// 	needLoad := (page-1)*pageSize >= c.total
// 	c.mutex.RUnlock()

// 	if needLoad {
// 		offset := c.total
// 		limit := pageSize * 2
// 		err := c.LoadDataFromDB(db, startTime, endTime, offset, limit)
// 		if err != nil {
// 			return err
// 		}
// 	}
// 	return nil
// }