package adapterimpl

import (
	"context"
	"time"

	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/adapter"
	"github.com/tidbcloud/tidb-management-service/serverless-global-service/domain/entity"
)

type fakeSys9Lifecycle struct{}

func NewFakeSys9Lifecycle() adapter.Sys9Lifecycle {
	return &fakeSys9Lifecycle{}
}

func (s *fakeSys9Lifecycle) CreateCluster(_ context.Context, cluster *entity.Cluster) (*adapter.Sys9CreateClusterResult, error) {
	instanceID := "sys9-instance"
	if cluster != nil && cluster.ClusterId != "" {
		instanceID = cluster.ClusterId
	}
	return &adapter.Sys9CreateClusterResult{
		ServiceInstanceID: instanceID,
		OperationID:       "sys9-operation",
	}, nil
}

func (s *fakeSys9Lifecycle) GetOperation(_ context.Context, _ *entity.Cluster, operationID string) (*adapter.Sys9Operation, error) {
	if operationID == "" {
		operationID = "sys9-operation"
	}
	return &adapter.Sys9Operation{
		OperationID: operationID,
		Phase:       "OPERATION_PHASE_SUCCEEDED",
		ResourceID:  "00000000-0000-4000-8000-000000000001",
	}, nil
}

func (s *fakeSys9Lifecycle) DeleteCluster(_ context.Context, _ *entity.Cluster, _ string) error {
	return nil
}

func (s *fakeSys9Lifecycle) GetManagedDatabaseConnectionInfo(
	_ context.Context,
	_ *entity.Cluster,
	_ string,
) (*adapter.Sys9ManagedDatabaseConnectionInfo, error) {
	return &adapter.Sys9ManagedDatabaseConnectionInfo{
		Host: "127.0.0.1",
		Port: 5432,
	}, nil
}

func (s *fakeSys9Lifecycle) RotateManagedDatabaseAdministrativeCredential(
	_ context.Context,
	_ *entity.Cluster,
	_ string,
	_ string,
) (string, error) {
	return "sys9-operation", nil
}

func (s *fakeSys9Lifecycle) RedeemManagedDatabaseAdministrativeCredential(
	_ context.Context,
	_ *entity.Cluster,
	_ string,
	_ string,
) (string, error) {
	return "fake-pg-password", nil
}

func (s *fakeSys9Lifecycle) CreateManagedDatabaseBackup(
	_ context.Context,
	_ *entity.Cluster,
	_ string,
) (string, error) {
	return "sys9-operation", nil
}

func (s *fakeSys9Lifecycle) ListManagedDatabaseBackups(
	_ context.Context,
	_ *entity.Cluster,
	_ string,
	_ *adapter.Sys9ListManagedDatabaseBackupsRequest,
) (*adapter.Sys9ListManagedDatabaseBackupsResponse, error) {
	backupTime := time.Now().UTC().Add(-time.Hour)
	expireTime := backupTime.Add(7 * 24 * time.Hour)
	return &adapter.Sys9ListManagedDatabaseBackupsResponse{
		Items: []*adapter.Sys9ManagedDatabaseBackup{{
			BackupID:   "00000000-0000-4000-8000-000000000001",
			BackupName: "fake-backup",
			BackupTime: backupTime,
			State:      "BACKUP_STATE_AVAILABLE",
			Expiration: &expireTime,
		}},
		HasMore:       false,
		NextPageToken: "",
	}, nil
}

func (s *fakeSys9Lifecycle) GetManagedDatabaseBackup(
	_ context.Context,
	_ *entity.Cluster,
	_ string,
	backupID string,
) (*adapter.Sys9ManagedDatabaseBackup, error) {
	backupTime := time.Now().UTC().Add(-time.Hour)
	expireTime := backupTime.Add(7 * 24 * time.Hour)
	if backupID == "" {
		backupID = "00000000-0000-4000-8000-000000000001"
	}
	return &adapter.Sys9ManagedDatabaseBackup{
		BackupID:   backupID,
		BackupName: "fake-backup",
		BackupTime: backupTime,
		State:      "BACKUP_STATE_AVAILABLE",
		Expiration: &expireTime,
	}, nil
}

func (s *fakeSys9Lifecycle) GetManagedDatabaseBackupPolicy(
	_ context.Context,
	_ *entity.Cluster,
	_ string,
) (*adapter.Sys9ManagedDatabaseBackupPolicy, error) {
	return &adapter.Sys9ManagedDatabaseBackupPolicy{
		Enabled:       true,
		Schedule:      "BACKUP_SCHEDULE_DAILY",
		RetentionDays: 7,
	}, nil
}

func (s *fakeSys9Lifecycle) UpdateManagedDatabaseBackupPolicy(
	_ context.Context,
	_ *entity.Cluster,
	_ string,
	policy *adapter.Sys9ManagedDatabaseBackupPolicy,
) (*adapter.Sys9ManagedDatabaseBackupPolicy, error) {
	if policy == nil {
		return &adapter.Sys9ManagedDatabaseBackupPolicy{}, nil
	}
	return policy, nil
}
