package model

import (
	"database/sql/driver"
	"encoding/json"

	"github.com/pingcap-inc/clinic/clinic_data_service/pkg/config"
)

type SlowQueryLog struct {
	FormattedTimestamp string           `gorm:"column:Formatted_Timestamp;type:varchar(64)"`
	ClusterID          string           `gorm:"column:Cluster_Id;type:varchar(128)"`
	Query              string           `gorm:"column:Query;type:text"` // SQL statements are usually long, keep as text
	QueryTime          float64          `gorm:"column:Query_time;type:real"`
	Plan               string           `gorm:"column:Plan;type:text"`
	PlanDigest         string           `gorm:"column:Plan_digest;type:varchar(64)"`
	BinaryPlan         string           `gorm:"column:Binary_plan;type:text"`
	BinaryPlanParsed   BinaryPlanParsed `gorm:"column:Binary_plan_parsed;type:json"`
	DB                 string           `gorm:"column:DB;type:varchar(64)"`
	Succ               bool             `gorm:"column:Succ;type:boolean"`
	PatternName        string           `gorm:"column:Pattern_Name;type:varchar(64)"`
	PatternNameSub     string           `gorm:"column:Pattern_name_sub;type:varchar(64)"`
	SourceFile         string           `gorm:"column:Source_file;type:varchar(128)"`
	Digest             string           `gorm:"column:Digest;type:varchar(128)"`
	IndexNames         string           `gorm:"column:Index_names;type:varchar(128)"`
	MemMax             int64            `gorm:"column:Mem_max;type:integer"`
	Stats              string           `gorm:"column:Stats;type:varchar(128)"`
	Warnings           string           `gorm:"column:Warnings;type:varchar(128)"`
	ConnID             int64            `gorm:"column:Conn_ID;type:integer"`
	RequestUnitRead    float64          `gorm:"column:Request_unit_read;type:real"`
	RequestUnitWrite   float64          `gorm:"column:Request_unit_write;type:real"`
	TimestampStr       string           `gorm:"column:Timestamp_str;type:varchar(64)"`
	Timestamp          float64          `gorm:"column:Timestamp;type:real"`
	// WriteSqlResponseTotal    float64     `json:"Write_sql_response_total"`

}

// TableName returns the table name for the given date
// This method allows dynamic table naming based on date
func (SlowQueryLog) TableName() string {
	// This will be overridden when using the entity
	// Example: slowQueryLog.TableName = func() string { return "20250701" }
	tableName := config.AppConfig.Day
	return tableName
}

// SetTableName sets a custom table name for dynamic table naming
func (s *SlowQueryLog) SetTableName(tableName string) {
	// This is a helper method, actual table name setting will be done via GORM's Table() method
}

// BinaryPlanParsed represents the JSON structure for Binary_plan_parsed field
type BinaryPlanParsed map[string]interface{}

// Value implements the driver.Valuer interface for GORM
func (b BinaryPlanParsed) Value() (driver.Value, error) {
	if b == nil {
		return nil, nil
	}
	return json.Marshal(b)
}

// Scan implements the sql.Scanner interface for GORM
func (b *BinaryPlanParsed) Scan(value interface{}) error {
	if value == nil {
		return nil
	}
	switch v := value.(type) {
	case []byte:
		return json.Unmarshal(v, b)
	case string:
		return json.Unmarshal([]byte(v), b)
	default:
		return nil
	}
}
