// Copyright 2016 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 longrunning

import (
	"fmt"
	"time"

	"github.com/golang/protobuf/ptypes"
	"github.com/golang/protobuf/ptypes/duration"
	"github.com/golang/protobuf/ptypes/timestamp"
	"golang.org/x/net/context"
	pb "google.golang.org/genproto/googleapis/longrunning"
)

func bestMomentInHistory() (*Operation, error) {
	t, err := time.Parse("2006-01-02 15:04:05.999999999 -0700 MST", "2009-11-10 23:00:00 +0000 UTC")
	if err != nil {
		return nil, err
	}
	resp, err := ptypes.TimestampProto(t)
	if err != nil {
		return nil, err
	}
	respAny, err := ptypes.MarshalAny(resp)
	if err != nil {
		return nil, err
	}
	metaAny, err := ptypes.MarshalAny(ptypes.DurationProto(1 * time.Hour))
	return &Operation{
		proto: &pb.Operation{
			Name:     "best-moment",
			Done:     true,
			Metadata: metaAny,
			Result: &pb.Operation_Response{
				Response: respAny,
			},
		},
	}, err
}

func ExampleOperation_Wait() {
	// Complex computation, might take a long time.
	op, err := bestMomentInHistory()
	if err != nil {
		// TODO: Handle err.
	}
	var ts timestamp.Timestamp
	err = op.Wait(context.TODO(), &ts)
	if err != nil && !op.Done() {
		fmt.Println("failed to fetch operation status", err)
	} else if err != nil && op.Done() {
		fmt.Println("operation completed with error", err)
	} else {
		fmt.Println(ptypes.TimestampString(&ts))
	}
	// Output:
	// 2009-11-10T23:00:00Z
}

func ExampleOperation_Metadata() {
	op, err := bestMomentInHistory()
	if err != nil {
		// TODO: Handle err.
	}

	// The operation might contain metadata.
	// In this example, the metadata contains the estimated length of time
	// the operation might take to complete.
	var meta duration.Duration
	if err := op.Metadata(&meta); err != nil {
		// TODO: Handle err.
	}
	d, err := ptypes.Duration(&meta)
	if err == ErrNoMetadata {
		fmt.Println("no metadata")
	} else if err != nil {
		// TODO: Handle err.
	} else {
		fmt.Println(d)
	}
	// Output:
	// 1h0m0s
}

func ExampleOperation_Cancel() {
	op, err := bestMomentInHistory()
	if err != nil {
		// TODO: Handle err.
	}
	if err := op.Cancel(context.Background()); err != nil {
		// TODO: Handle err.
	}
}

func ExampleOperation_Delete() {
	op, err := bestMomentInHistory()
	if err != nil {
		// TODO: Handle err.
	}
	if err := op.Delete(context.Background()); err != nil {
		// TODO: Handle err.
	}
}
