package transactional_operation

import (
	"database/sql"
	"strings"
	"validate/dbctrl"
	"validate/util"
)

func GetPlacementPolicyList(db *sql.DB) (variables []*dbctrl.PlacementPolicy, err error) {
	tx, err := db.Begin()
	if err != nil {
		return nil, err
	}
	defer func() {
		commitErr := tx.Commit()
		if commitErr != nil {
			util.Logger.Fatalf("failed to COMMIT transaction, " + commitErr.Error())
		}
	}()

	placementPolicyList, err := dbctrl.GetAllPlacementPolicy(tx)
	if err != nil {
		return nil, err
	}

	tableList, err := dbctrl.GetAllTableWithPlacementRule(tx)
	if err != nil {
		return nil, err
	}

	partitionTableList, err := dbctrl.GetAllPartitionTableWithPlacementRule(tx)
	if err != nil {
		return nil, err
	}

	databaseList, err := dbctrl.GetAllDatabaseWithPlacementRule(tx)
	if err != nil {
		return nil, err
	}

	for _, policy := range placementPolicyList {
		for _, database := range databaseList {
			if 0 == strings.Compare(strings.TrimSpace(database.TIDB_PLACEMENT_POLICY_NAME),
				strings.TrimSpace(policy.POLICY_NAME)) {
				policy.DatabaseList = append(policy.DatabaseList, database)
			}
		}

		for _, table := range tableList {
			if 0 == strings.Compare(strings.TrimSpace(table.TIDB_PLACEMENT_POLICY_NAME),
				strings.TrimSpace(policy.POLICY_NAME)) {
				policy.TableList = append(policy.TableList, table)
			}
		}
		for _, partitionTable := range partitionTableList {
			if 0 == strings.Compare(strings.TrimSpace(partitionTable.TIDB_PLACEMENT_POLICY_NAME),
				strings.TrimSpace(policy.POLICY_NAME)) {
				policy.PartitionTableList = append(policy.PartitionTableList, partitionTable)
			}
		}
	}

	return placementPolicyList, nil
}
