package api

import (
	"fmt"
	"strings"
	"time"

	"github.com/tidbcloud/account/internel/dao/entity"
	"github.com/tidbcloud/account/internel/svc/admin"
	"github.com/tidbcloud/account/internel/svc/auditlog"

	"github.com/tidbcloud/account/admin/forms"
)

func buildAPITenantItem(item *admin.Tenant) forms.Tenant {
	return forms.Tenant{
		ID:                        item.ID.Uint64(),
		Name:                      item.Name,
		Alias:                     item.Alias,
		Email:                     maskEmailUser(item.Email),
		Timezone:                  item.Timezone,
		Status:                    item.Status,
		Plan:                      item.Plan,
		DiscountDescription:       item.DiscountDescription,
		Discount:                  item.Discount,
		Country:                   item.Country,
		HasDiscount:               item.HasDiscount,
		TotalCredit:               item.TotalCredit,
		RemainingCredit:           item.RemainingCredit,
		CreatedAt:                 item.CreateAt.Unix(),
		Kind:                      item.Kind,
		AccountManager:            item.AccountManager,
		ThirdPartyAccountProvider: item.ThirdPartyAccountProvider,
		ThirdPartyAccountCode:     item.ThirdPartyAccountCode,
		OrgTag:                    item.OrgTag,
		OrgType:                   item.OrgType,
	}
}
func buildUserOrgItem(org entity.Tenant) forms.Tenant {
	bean := forms.Tenant{
		ID:             org.ID.Uint64(),
		Name:           org.Name,
		Alias:          org.Alias,
		Email:          maskEmailUser(org.Email),
		Status:         string(org.Status),
		Country:        org.Country,
		Kind:           string(org.Kind),
		AccountManager: org.AccountManager,

		OrgTag: org.OrgTag,
	}
	if org.ThirdPartyAccountCode != nil {
		bean.ThirdPartyAccountProvider = *org.ThirdPartyAccountProvider
	}
	if org.ThirdPartyAccountProvider != nil {
		bean.ThirdPartyAccountProvider = *org.ThirdPartyAccountProvider
	}
	return bean
}

func maskEmailUser(email string) string {
	atIndex := strings.Index(email, "@")
	if atIndex != -1 && atIndex > 0 {
		email = fmt.Sprintf("%s%s%s", string(email[0]), strings.Repeat("*", atIndex-1), email[atIndex:])
	}
	return email
}

func buildAPIAccessLog(item auditlog.AccessLog) forms.AccessLog {
	return forms.AccessLog{
		ID:         item.ID,
		HappenedOn: item.HappenedOn,
		User:       item.User,
		Content:    item.Content,
	}
}

// nolint:deadcode
func buildAPIKey(item string) forms.CreateAPIKeyResp {
	return forms.CreateAPIKeyResp{
		APIKey: item,
	}
}

const (
	RegionDefaultBackupTimeFormat = "15:04"
)

func validateBackupTime(backupTime string) error {
	_, err := time.Parse(RegionDefaultBackupTimeFormat, backupTime)
	return err
}

// nolint:deadcode
func buildInternalSystemSettings(s forms.SystemSettings) *admin.SystemSettings {
	return &admin.SystemSettings{
		EnableDevTier: admin.EnableDevTier{
			EnableOnAws: s.EnableDevTier.EnableOnAws,
			EnableOnGcp: s.EnableDevTier.EnableOnGcp,
		},
	}
}

// nolint:deadcode
func buildSystemSettings(settings *admin.SystemSettings) forms.SystemSettings {
	return forms.SystemSettings{
		EnableDevTier: forms.EnableDevTier{
			EnableOnAws: settings.EnableDevTier.EnableOnAws,
			EnableOnGcp: settings.EnableDevTier.EnableOnGcp,
		},
	}
}

// nolint:deadcode
func buildDashboardStats(stats *admin.DashboardStats) forms.GetDashboardStatsResq {
	return forms.GetDashboardStatsResq{
		DevTier: forms.DevTierStats{
			AwsActiveClustersCount: stats.DevTier.AwsActiveClustersCount,
			GcpActiveClustersCount: stats.DevTier.GcpActiveClustersCount,
		},
	}
}
