package schema_utils

import (
	"context"
	"moss-dev/datahub/api"
	"sort"
	"strings"

	"github.com/juju/errors"
	"github.com/pingcap/log"
	"go.uber.org/zap"
)

type DatahubDB struct {
	client *api.DatahubClient
}

func NewDatahubDB(client *api.DatahubClient) *DatahubDB {
	return &DatahubDB{client: client}
}

func (dh *DatahubDB) FetchTableInfo(ctx context.Context, urn, datasetID, tableID string) (*TableInfo, error) {
	data, err := dh.client.FetchDataset(urn)
	if err != nil {
		return nil, errors.Trace(err)
	}

	datasetNames := strings.Split(data.Dataset.Name, ".")
	var (
		project      string
		db           string
		table        string
		tableComment = data.Dataset.EditableProperties.Description
	)
	if len(datasetNames) == 3 {
		project = datasetNames[0]
		db = datasetNames[1]
		table = datasetNames[2]
	} else if len(datasetNames) == 2 {
		db = datasetNames[0]
		table = datasetNames[1]
	} else {
		return nil, errors.New("dataset name is not correct")
	}
	log.Info("fetch table info", zap.String("project", project), zap.String("db", db), zap.String("table", table), zap.String("tableComment", tableComment))

	tableInfo := NewTableInfo(db, table, tableComment)

	var colComment = make(map[string]string)
	for _, field := range data.Dataset.EditableSchemaMetadata.EditableSchemaFieldInfo {
		colComment[field.FieldPath] = field.Description
	}

	for _, field := range data.Dataset.SchemaMetadata.Fields {
		fieldName := field.FieldPath
		fieldComment := colComment[field.FieldPath]
		fieldType := field.Type
		tableInfo.AddColumn(fieldName, fieldType, fieldComment)
	}

	for _, tag := range data.Dataset.Tags.Tags {
		tableInfo.Tags = append(tableInfo.Tags, tag.Tag.Properties.Name)
	}
	sort.Strings(tableInfo.Tags)

	return tableInfo, nil
}
