package migrate_record

import (
	"github.com/pingcap/dbaas/billing2/db/entity"
	"gorm.io/gorm"
)

// 2026-06-22-binded-packages-measure-indexes
//
// Adds composite indexes for the OR-rewrite in GetEffectiveBindedPackages:
//   - binded_packages(tenant_id, status, internal)         — branch A (internal=1)
//   - binded_packages(tenant_id, status, binded_billing_config_id) — branch B
//   - unit_filter_binded_packages(binded_package_id)       — GORM Preload IN-list
//
// ANALYZE TABLE binded_packages is critical: without it the optimizer
// sees cardinality=0 on new indexes and falls back to a table scan.
var _ = AddMigrateRecord(
	"2026-06-22-binded-packages-measure-indexes",
	func(db *gorm.DB) error {
		if err := db.AutoMigrate(&entity.BindedPackage{}); err != nil {
			return err
		}

		// unit_filter_binded_packages is a GORM m2m join table with
		// no entity of its own. MySQL 8 has no CREATE INDEX IF NOT
		// EXISTS — guard with information_schema for idempotency.
		var idxExists int
		if err := db.Raw(
			"SELECT COUNT(*) FROM information_schema.statistics "+
				"WHERE table_schema = DATABASE() AND table_name = ? AND index_name = ?",
			"unit_filter_binded_packages", "idx_ufbp_binded_package_id",
		).Scan(&idxExists).Error; err != nil {
			return err
		}
		if idxExists == 0 {
			if err := db.Exec(
				"CREATE INDEX `idx_ufbp_binded_package_id` " +
					"ON `unit_filter_binded_packages` (`binded_package_id`)",
			).Error; err != nil {
				return err
			}
		}

		// ANALYZE is critical: without it the optimizer sees
		// cardinality=0 on new indexes and falls back to a table
		// scan. unit_filter_binded_packages doesn't need it — the
		// PK leading column already covers the IN-list lookup.
		if err := db.Exec("ANALYZE TABLE binded_packages").Error; err != nil {
			return err
		}
		return nil
	},
)
