package sale_order

import (
	"context"

	SOProto "github.com/AlchemyTelcoSolutions/proto/gen/go/callisto/so/v1"
	"github.com/AlchemyTelcoSolutions/xutils-go/xlogger"
	"google.golang.org/grpc"

	"github.com/AlchemyTelcoSolutions/callisto-so-bff/cmd/app/config"
	"github.com/AlchemyTelcoSolutions/callisto-so-bff/internal/auth"
	"github.com/AlchemyTelcoSolutions/callisto-so-bff/internal/proxy"
)

// Service is a struct for the service of Sale Order
type Service struct {
	logger           xlogger.Logger
	configs          config.AppConfig
	httpProxySvc     proxy.ProxyService
	authService      auth.AuthService
	callistoSOClient SOServiceClient
}

// SOServiceClient is the interface for Callisto Sale Order Service Client
type SOServiceClient interface {
	CreateSaleOrder(ctx context.Context, req *SOProto.CreateSaleOrderRequest, opts ...grpc.CallOption) (*SOProto.CreateSaleOrderResponse, error)
	GetSummary(ctx context.Context, in *SOProto.GetSummaryRequest, opts ...grpc.CallOption) (*SOProto.GetSummaryResponse, error)
	UpdateStatus(ctx context.Context, re *SOProto.UpdateStatusRequest, opts ...grpc.CallOption) (*SOProto.UpdateStatusResponse, error)
	AddDocument(ctx context.Context, re *SOProto.AddDocumentRequest, opts ...grpc.CallOption) (*SOProto.AddDocumentResponse, error)
	AddShipment(ctx context.Context, re *SOProto.AddShipmentRequest, opts ...grpc.CallOption) (*SOProto.AddShipmentResponse, error)
	GetShipments(ctx context.Context, re *SOProto.GetShipmentsRequest, opts ...grpc.CallOption) (*SOProto.GetShipmentsResponse, error)
	AddAsn(ctx context.Context, re *SOProto.AddAsnRequest, opts ...grpc.CallOption) (*SOProto.AddAsnResponse, error)
	GetAsnData(ctx context.Context, re *SOProto.GetAsnDataRequest, opts ...grpc.CallOption) (*SOProto.GetAsnDataResponse, error)
	AddApproval(ctx context.Context, re *SOProto.AddApprovalRequest, opts ...grpc.CallOption) (*SOProto.AddApprovalResponse, error)
	AddNote(ctx context.Context, re *SOProto.AddNoteRequest, opts ...grpc.CallOption) (*SOProto.AddNoteResponse, error)
	UpdateNote(ctx context.Context, re *SOProto.UpdateNoteRequest, opts ...grpc.CallOption) (*SOProto.UpdateNoteResponse, error)
	UpdateShipment(ctx context.Context, re *SOProto.UpdateShipmentRequest, opts ...grpc.CallOption) (*SOProto.UpdateShipmentResponse, error)
	RemoveDocument(ctx context.Context, re *SOProto.RemoveDocumentRequest, opts ...grpc.CallOption) (*SOProto.RemoveDocumentResponse, error)
	GetNewReference(ctx context.Context, re *SOProto.GetNewReferenceRequest, opts ...grpc.CallOption) (*SOProto.GetNewReferenceResponse, error)
	GetInvoices(ctx context.Context, re *SOProto.GetInvoicesRequest, opts ...grpc.CallOption) (*SOProto.GetInvoicesResponse, error)
	CheckOrderAffiliation(ctx context.Context, in *SOProto.CheckOrderAffiliationRequest, opts ...grpc.CallOption) (*SOProto.CheckOrderAffiliationResponse, error)
}
