package metering

import (
	"gorm.io/gorm"

	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/dedicated-global-service/infra/repoimpl/schema"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func ClusterMeteringEnToModel(metering *entity.ClusterMetering) *schema.ClusterMetering {
	out := &schema.ClusterMetering{
		Model: gorm.Model{
			ID: uint(metering.ID),
		},
		TenantID:  metering.TenantID,
		ProjectID: metering.ProjectID,
		ClusterID: metering.ClusterID,
		StartTS:   metering.StartTS,
		EndTS:     metering.EndTs,
		Latest:    metering.Latest,
	}

	return out
}

func ClusterMeteringModelToEn(record *schema.ClusterMetering) (*entity.ClusterMetering, bizerr.BizError) {
	out := &entity.ClusterMetering{
		ID:        uint64(record.ID),
		TenantID:  record.TenantID,
		ProjectID: record.ProjectID,
		ClusterID: record.ClusterID,
		StartTS:   record.StartTS,
		Latest:    record.Latest,
		EndTs:     record.EndTS,
	}

	return out, nil
}

func ReportRecordEnToModel(en *entity.BillingReportRecord) *schema.BillingReportRecord {
	out := &schema.BillingReportRecord{
		Model: gorm.Model{
			ID: uint(en.ID),
		},
		Data:              schema.MeteringReportData{},
		Status:            string(en.Status),
		ClusterMeteringID: en.ClusterMeteringID,
		TenantID:          en.TenantID,
	}
	for _, each := range en.Data {
		out.Data.Items = append(out.Data.Items, &schema.MeteringReportDataItem{
			CostID:        each.CostID,
			SKU:           each.SKU,
			CostTimeStamp: each.CostTimeStamp,
			Cost:          each.Cost,
			Labels:        each.Labels,
			Memo:          each.Memo,
		})
	}
	return out
}

func ReportRecordModelToEn(record *schema.BillingReportRecord) *entity.BillingReportRecord {
	out := &entity.BillingReportRecord{
		ID:                uint64(record.ID),
		CreatedAt:         record.CreatedAt,
		Data:              nil,
		Status:            entity.BillingRecordStatus(record.Status),
		ClusterMeteringID: record.ClusterMeteringID,
		TenantID:          record.TenantID,
	}
	for _, each := range record.Data.Items {
		out.Data = append(out.Data, &entity.BillingMeteringReport{
			CostID:        each.CostID,
			SKU:           each.SKU,
			CostTimeStamp: each.CostTimeStamp,
			Cost:          each.Cost,
			Labels:        each.Labels,
			Memo:          each.Memo,
		})
	}

	return out
}
