/*
Copyright 2020 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package database

import (
	"context"
	"fmt"
	"regexp"
	"time"

	pbt "github.com/golang/protobuf/ptypes/timestamp"
	"github.com/googleapis/gax-go/v2"
	databasepb "google.golang.org/genproto/googleapis/spanner/admin/database/v1"
)

var (
	validDBPattern = regexp.MustCompile("^projects/(?P<project>[^/]+)/instances/(?P<instance>[^/]+)/databases/(?P<database>[^/]+)$")
)

// StartBackupOperation creates a backup of the given database. It will be stored
// as projects/<project>/instances/<instance>/backups/<backupID>. The
// backup will be automatically deleted by Cloud Spanner after its expiration.
//
// backupID must be unique across an instance.
//
// expireTime is the time the backup will expire. It is respected to
// microsecond granularity.
//
// databasePath must have the form
// projects/<project>/instances/<instance>/databases/<database>.
func (c *DatabaseAdminClient) StartBackupOperation(ctx context.Context, backupID string, databasePath string, expireTime time.Time, opts ...gax.CallOption) (*CreateBackupOperation, error) {
	m := validDBPattern.FindStringSubmatch(databasePath)
	if m == nil {
		return nil, fmt.Errorf("database name %q should conform to pattern %q",
			databasePath, validDBPattern)
	}
	ts := &pbt.Timestamp{Seconds: expireTime.Unix(), Nanos: int32(expireTime.Nanosecond())}
	// Create request from parameters.
	req := &databasepb.CreateBackupRequest{
		Parent:   fmt.Sprintf("projects/%s/instances/%s", m[1], m[2]),
		BackupId: backupID,
		Backup: &databasepb.Backup{
			Database:   databasePath,
			ExpireTime: ts,
		},
	}
	return c.CreateBackup(ctx, req, opts...)
}
