package accountdb

import (
	"time"

	"github.com/tidbcloud/account/idl/pbgen/proto/account"
	"github.com/tidbcloud/dataflow-service-ng/pkg/account/accounttypes"
	"google.golang.org/protobuf/types/known/timestamppb"
)

func FromTimestamp(t interface{}) *time.Time {
	var tm time.Time
	switch v := t.(type) {
	case timestamppb.Timestamp:
		tm = v.AsTime()
	case *timestamppb.Timestamp:
		if t == nil {
			return nil
		}
		tm = v.AsTime()
	default:
		return nil
	}

	return &tm
}

func ConvertUser(user *account.User) *accounttypes.User {
	return &accounttypes.User{
		Updatable: accounttypes.Updatable{
			Base: accounttypes.Base{
				ID: user.Id,
			},
		},
		FirstName:   user.FirstName,
		LastName:    user.LastName,
		Email:       user.Email,
		Status:      user.Status,
		InvitedAt:   FromTimestamp(user.InvitedAt),
		Job:         user.Job,
		PhoneNumber: user.PhoneNumber,
	}
}

func convertOrg(org *account.Org) *accounttypes.Tenant {
	return &accounttypes.Tenant{
		Updatable: accounttypes.Updatable{
			Base: accounttypes.Base{
				ID: org.Id,
			},
		},
		Name:                      org.Name,
		Alias:                     org.Alias,
		Email:                     org.Email,
		Country:                   org.Country,
		TimeZone:                  org.TimeZone,
		Status:                    accounttypes.TenantStatus(org.Status),
		Plan:                      accounttypes.TenantPlan(org.Plan),
		POCBindedPackageID:        org.PocBindedPackageId,
		OnDemandBindedPackageID:   org.OnDemandBindedPackageId,
		DevTierBindedPackageID:    org.DevTierBindedPackageId,
		Kind:                      accounttypes.TenantKind(org.Kind),
		AcceptService:             org.AcceptService,
		ZendeskID:                 org.ZendeskId,
		ThirdPartyAccountProvider: &org.ThirdPartyAccountProvider,
		ThirdPartyAccountCode:     &org.ThirdPartyAccountCode,
		Projects:                  []*accounttypes.Project{}, // WARN: Empty value, do not use
		BillingEmail:              org.BillingEmail,
		AccountManager:            org.AccountManager,
	}
}

func convertProject(project *account.Project) *accounttypes.Project {
	return &accounttypes.Project{
		Updatable: accounttypes.Updatable{
			Base: accounttypes.Base{
				ID: project.Id,
			},
		},
		Name:           project.Name,
		TenantID:       project.TenantId,
		Status:         accounttypes.ProjectStatus(project.Status),
		DeletedTime:    FromTimestamp(project.DeletedAt),
		IsCrossAccount: project.IsCrossAccount,
	}
}

func convertTrial(trial *account.Trial) *accounttypes.Trial {
	return &accounttypes.Trial{
		Base: accounttypes.Base{
			ID:        trial.Id,
			CreatedAt: *FromTimestamp(trial.CreatedAt),
		},
		CreatedByID:      trial.CreatedById,
		TenantID:         trial.OrgId,
		StartedAt:        *FromTimestamp(trial.StartedAt),
		EstimatedEndedAt: FromTimestamp(trial.EstimatedEndedAt),
		EndedAt:          FromTimestamp(trial.EndedAt),
		TrialType:        accounttypes.TrialType(trial.TrialType),
	}
}
