package converter

import (
	"reflect"
	"testing"
	"time"

	"github.com/AlchemyTelcoSolutions/callisto-so-bff/internal/domain/model"
	SOProto "github.com/AlchemyTelcoSolutions/proto/gen/go/callisto/so/v1"
	"google.golang.org/protobuf/types/known/timestamppb"
)

func TestToProtoFromNoteRequest(t *testing.T) {
	timeNow := time.Now()

	type args struct {
		req *model.UpdateNoteData
	}
	tests := []struct {
		name string
		args args
		want *SOProto.AddNoteRequest
	}{
		{
			name: "Success",
			args: args{req: &model.UpdateNoteData{
				OrderReference: "order",
				CreatedAt:      timeNow,
				UserID:         1,
				Note:           "note",
			}},
			want: &SOProto.AddNoteRequest{
				OrderRef:  "order",
				CreatedAt: timestamppb.New(timeNow),
				CreatedBy: 1,
				Details:   "note",
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := ToProtoFromNoteRequest(tt.args.req); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("ToProtoFromNoteRequest() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestToProtoFromShipmentRequest(t *testing.T) {
	timeNow := time.Now()

	type args struct {
		req *model.AddShipmentData
	}
	tests := []struct {
		name string
		args args
		want *SOProto.AddShipmentRequest
	}{
		{
			name: "Success",
			args: args{req: &model.AddShipmentData{
				DispatchedAt: &timeNow,
				IsCollection: true,
				TrackingCode: "tracking",
				TrackingUrl:  "url",
				CreatedAt:    timeNow,
				Priority:     1,
				NoAirbill:    true,
			}},
			want: &SOProto.AddShipmentRequest{
				Shipment: &SOProto.Shipment{
					OrderRef:     "",
					IsCollection: true,
					TrackingCode: "tracking",
					TrackingUrl:  "url",
					DispatchedAt: timestamppb.New(timeNow),
					CreatedAt:    timestamppb.New(timeNow),
					CreatedBy:    0,
					Priority:     SOProto.Shipment_Priority(1),
					NoWaybill:    true,
				},
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := ToProtoFromShipmentRequest(tt.args.req); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("ToProtoFromShipmentRequest() = %v, want %v", got, tt.want)
			}
		})
	}
}

func TestToAddDocumentToProto(t *testing.T) {
	type args struct {
		data *model.AddDocumentData
	}
	tests := []struct {
		name string
		args args
		want *SOProto.AddDocumentRequest
	}{
		{
			name: "Success",
			args: args{data: &model.AddDocumentData{
				OrderReference: "order",
				Url:            "url",
				Hash:           "hash",
				CreatedBy:      1,
				DocumentType:   1,
			}},
			want: &SOProto.AddDocumentRequest{
				OrderRef:     "order",
				DocumentType: SOProto.Doctype(1),
				Url:          "url",
				Hash:         "hash",
				CreatedBy:    1,
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := ToAddDocumentToProto(tt.args.data); !reflect.DeepEqual(got, tt.want) {
				t.Errorf("ToAddDocumentProto() = %v, want %v", got, tt.want)
			}
		})
	}
}
