package console

import (
	"encoding/json"

	"github.com/tidbcloud/dataflow-service/app/models/domain"
	"github.com/tidbcloud/tiinf/sdk/auditlog"
)

type ModifyBackupSettingAuditLogDetail struct {
	Before *ModifyBackupSettingAuditLogDetailItem `json:"before,omitempty"`
	After  *ModifyBackupSettingAuditLogDetailItem `json:"after,omitempty"`
	Error  *string                                `json:"error,omitempty"`
}

type ModifyBackupSettingAuditLogDetailItem struct {
	SnapshotBackupSchedule *domain.SnapshotBackupSchedule `json:"snapshot_backup_schedule,omitempty"`
	PiTR                   *domain.PiTRSetting            `json:"pitr,omitempty"`
	Regions                []string                       `json:"regions,omitempty"`
}

type CreateManualBackupAuditLogDetail struct {
	BackupID   string  `json:"backup_id,omitempty"`
	BackupName string  `json:"backup_name,omitempty"`
	Error      *string `json:"error,omitempty"`
}

type BackupCompletedLogDetail struct {
	BackupID   string  `json:"backup_id,omitempty"`
	BackupName string  `json:"backup_name,omitempty"`
	BackupType string  `json:"backup_type,omitempty"`
	StartsAt   string  `json:"starts_at,omitempty"`
	EndsAt     string  `json:"ends_at,omitempty"`
	Error      *string `json:"error,omitempty"`
}

type CreateBackupExportAuditLogDetail struct {
	BackupID         uint64  `json:"backup_id,string,omitempty"`
	BackupName       string  `json:"backup_name,omitempty"`
	BackupExportID   uint64  `json:"backup_export_id,string,omitempty"`
	BackupExportName string  `json:"backup_export_name,omitempty"`
	Error            *string `json:"error,omitempty"`
}
type DeleteBackupAuditLogDetail struct {
	BackupName string  `json:"backup_name,omitempty"`
	BackupType string  `json:"backup_type,omitempty"`
	Error      *string `json:"error,omitempty"`
}

type SnapshotRestoreAuditLogDetail struct {
	BackupClusterID uint64                `json:"backup_cluster_id,string,omitempty"`
	BackupID        uint64                `json:"backup_id,string,omitempty"`
	BackupName      string                `json:"backup_name,omitempty"`
	RestoreCluster  *domain.ClusterConfig `json:"restore_cluster,omitempty"`
	Error           *string               `json:"error,omitempty"`
}

type PitRestoreAuditLogDetail struct {
	BackupClusterID uint64                `json:"backup_cluster_id,string,omitempty"`
	RestoredTs      int64                 `json:"restored_ts,string,omitempty"`
	RestoreCluster  *domain.ClusterConfig `json:"restore_cluster,omitempty"`
	Error           *string               `json:"error,omitempty"`
}

type ServerlessRestoreAuditLogDetail struct {
	RestoreID   string                 `json:"restore_id,omitempty"`
	RestoreMode *ServerlessRestoreMode `json:"restore_mode,omitempty"`
	Error       string                 `json:"error,omitempty"`
}

type ServerlessRestoreMode struct {
	Snapshot    *ServerlessSnapshot `json:"snapshot,omitempty"`
	PointInTime int64               `json:"point_in_time,string,omitempty"`
}

type ServerlessSnapshot struct {
	BackupID string `json:"backup_id,omitempty"`
	Time     int64  `json:"time,string,omitempty"`
}

type ServerlessDeleteBackupAuditLogDetail struct {
	BackupID     string `json:"backup_id,omitempty"`
	SnapshotTime int64  `json:"snapshot_time,string,omitempty"`
	Error        string `json:"error,omitempty"`
}

type ServerlessBackupSettingAuditLogDetail struct {
	Before *ServerlessBackupSetting `json:"before,omitempty"`
	After  *ServerlessBackupSetting `json:"after,omitempty"`
	Error  string                   `json:"error,omitempty"`
}

type ServerlessBackupSetting struct {
	BackupTime      string `json:"backup_time,omitempty"`
	BackupRetention int    `json:"backup_retention,omitempty"`
	BackupCycle     string `json:"backup_cycle,omitempty"`
}

func ConvertToAuditLogDetail(a interface{}) (auditlog.Details, error) {
	marshal, err := json.Marshal(a)
	if err != nil {
		return nil, err
	}
	details := auditlog.Details{}
	if err = json.Unmarshal(marshal, &details); err != nil {
		return nil, err
	}
	return details, nil
}
