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

// Implements provision_service.proto (see proto for details)
package main

import (
	"context"
	"fmt"
	"net"

	"chromiumos/lro"

	"go.chromium.org/chromiumos/config/go/longrunning"
	"go.chromium.org/chromiumos/config/go/test/api"
	"go.chromium.org/luci/common/errors"
	"google.golang.org/grpc"
)

// startServer starts provision server on requested port.
func (s *provision) startServer(port int) error {
	l, err := net.Listen("tcp", fmt.Sprintf(":%d", port))
	if err != nil {
		return errors.Annotate(err, "start server: create listener at %d", port).Err()
	}
	s.manager = lro.New()
	defer s.manager.Close()
	server := grpc.NewServer()
	api.RegisterProvisionServiceServer(server, s)
	longrunning.RegisterOperationsServer(server, s.manager)
	s.logger.Println("provisionservice listen to request at ", l.Addr().String())
	return server.Serve(l)
}

// InstallCros installs a specified version of Chrome OS on the DUT, along
// with any specified DLCs.
//
// If the DUT already has the specified list of DLCs, only the missing DLCs
// will be provisioned.
func (s *provision) InstallCros(ctx context.Context, req *api.InstallCrosRequest) (*longrunning.Operation, error) {
	s.logger.Println("Received api.InstallCrosRequest: ", *req)
	op := s.manager.NewOperation()
	response := api.InstallCrosResponse{}
	if fr, err := s.installCros(ctx, req, op); err != nil {
		response.Outcome = &api.InstallCrosResponse_Failure{
			Failure: fr,
		}
	} else {
		response.Outcome = &api.InstallCrosResponse_Success{}
	}
	s.manager.SetResult(op.Name, &response)
	return op, nil
}

// InstallLacros installs a specified version of Lacros on the DUT.
func (s *provision) InstallLacros(ctx context.Context, req *api.InstallLacrosRequest) (*longrunning.Operation, error) {
	op := s.manager.NewOperation()
	response := api.InstallLacrosResponse{}
	if fr, err := s.installLacros(ctx, req, op); err != nil {
		response.Outcome = &api.InstallLacrosResponse_Failure{
			Failure: fr,
		}
	} else {
		response.Outcome = &api.InstallLacrosResponse_Success{}
	}
	s.manager.SetResult(op.Name, &response)
	return op, nil
}

// InstallAsh installs a specified version of ash-chrome on the DUT.
//
// This directly overwrites the version of ash-chrome on the current root
// disk partition.
func (s *provision) InstallAsh(ctx context.Context, req *api.InstallAshRequest) (*longrunning.Operation, error) {
	op := s.manager.NewOperation()
	response := api.InstallAshResponse{}
	if fr, err := s.installAsh(ctx, req, op); err != nil {
		response.Outcome = &api.InstallAshResponse_Failure{
			Failure: fr,
		}
	} else {
		response.Outcome = &api.InstallAshResponse_Success{}
	}
	s.manager.SetResult(op.Name, &response)
	return op, nil
}

// InstallArc installs a specified version of ARC on the DUT.
//
// This directly overwrites the version of ARC on the current root
// disk partition.
func (s *provision) InstallArc(ctx context.Context, req *api.InstallArcRequest) (*longrunning.Operation, error) {
	op := s.manager.NewOperation()
	response := api.InstallArcResponse{}
	if fr, err := s.installArc(ctx, req, op); err != nil {
		response.Outcome = &api.InstallArcResponse_Failure{
			Failure: fr,
		}
	} else {
		response.Outcome = &api.InstallArcResponse_Success{}
	}
	s.manager.SetResult(op.Name, &response)
	return op, nil
}

// InstallFirmware installs AP/EC firmware to the DUT
func (s *provision) InstallFirmware(ctx context.Context, req *api.InstallFirmwareRequest) (*longrunning.Operation, error) {
	s.logger.Println("Received api.InstallFirmwareRequest: ", *req)
	op := s.manager.NewOperation()
	response := api.InstallFirmwareResponse{}
	if fr, err := s.installFirmware(ctx, req, op); err != nil {
		response.Outcome = &api.InstallFirmwareResponse_Failure{
			Failure: fr,
		}
	} else {
		response.Outcome = &api.InstallFirmwareResponse_Success{}
	}
	s.manager.SetResult(op.Name, &response)
	return op, nil
}
