// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package main

import (
	"log"
	"math/rand"
	"time"

	"mojo/public/go/application"
	"mojo/public/go/bindings"
	"mojo/public/go/system"

	"mojom/examples/fortune"
)

//#include "mojo/public/c/system/types.h"
import "C"

type FortuneImpl struct {
	wisdom []string   // All known fortunes.
	random *rand.Rand // To pick a random index in 'wisdom'.
}

// Makes an implementation.
func NewFortuneImpl() *FortuneImpl {
	return &FortuneImpl{
		wisdom: []string{
			"You will reach the heights of success.",
			"Conquer your fears or they will conquer you.",
			"Today is your lucky day!",
		},
		random: rand.New(rand.NewSource(time.Now().UnixNano())),
	}
}

func (f *FortuneImpl) Add(inValue string) (err error) {
	log.Printf("server Add: %s\n", inValue)

	f.wisdom = append(f.wisdom, inValue)
	return nil
}

func (f *FortuneImpl) Get() (outValue string, err error) {
	log.Printf("server Get\n")

	if len(f.wisdom) == 0 {
		return "[empty]", nil
	}
	return f.wisdom[f.random.Intn(len(f.wisdom))], nil
}

type FortuneServerDelegate struct {
	fortuneFactory FortuneFactory
}

type FortuneFactory struct {
	stubs   []*bindings.Stub
	fortune *FortuneImpl
}

func (delegate *FortuneServerDelegate) Initialize(context application.Context) {
	log.Printf("FortuneServerDelegate.Initialize...")
}

func (ff *FortuneFactory) Create(request fortune.Fortune_Request) {
	log.Printf("FortuneServerDelegate's FortuneFactory.Create...")
	stub := fortune.NewFortuneStub(request, ff.fortune, bindings.GetAsyncWaiter())
	ff.stubs = append(ff.stubs, stub)
	go func() {
		for {
			if err := stub.ServeRequest(); err != nil {
				connectionError, ok := err.(*bindings.ConnectionError)
				if !ok || !connectionError.Closed() {
					log.Println(err)
				}
				break
			}
		}
	}()
}

func (delegate *FortuneServerDelegate) AcceptConnection(connection *application.Connection) {
	log.Printf("FortuneServerDelegate.AcceptConnection...")
	connection.ProvideServicesWithDescriber(
		&fortune.Fortune_ServiceFactory{&delegate.fortuneFactory},
	)
}

func (delegate *FortuneServerDelegate) Quit() {
	log.Printf("FortuneServerDelegate.Quit...")
	for _, stub := range delegate.fortuneFactory.stubs {
		stub.Close()
	}
}

//export MojoMain
func MojoMain(handle C.MojoHandle) C.MojoResult {
	application.Run(&FortuneServerDelegate{
		fortuneFactory: FortuneFactory{
			fortune: NewFortuneImpl(),
		},
	}, system.MojoHandle(handle))
	return C.MOJO_RESULT_OK
}

func main() {
}
