package cost

import (
	"reflect"
	"testing"

	"cloud.google.com/go/bigquery"
	"github.com/spf13/viper"
	"github.com/tidbcloud/cost-collect/pkg/global"
)

func Test_awsDataExtract(t *testing.T) {
	viper.Set("server.enable_ipv4_metering", true)

	type args struct {
		row     map[string]bigquery.Value
		request global.Request
	}
	tests := []struct {
		name    string
		args    args
		want    []*global.Item
		wantErr bool
	}{
		{
			name: "should work normally",
			args: args{
				row: map[string]bigquery.Value{
					"resource_tags_user_tenant":      bigquery.Value("12345767"),
					"resource_tags_user_project":     bigquery.Value("12345767"),
					"resource_tags_user_usedby":      bigquery.Value("12345767"),
					"line_item_blended_cost":         bigquery.Value("12345767"),
					"line_item_unblended_cost":       bigquery.Value("12345767"),
					"line_item_usage_amount":         bigquery.Value("12345767"),
					"pricing_unit":                   bigquery.Value("12345767"),
					"line_item_resource_id":          bigquery.Value("12345767"),
					"service_name":                   bigquery.Value("AWSELB"),
					"line_item_operation":            bigquery.Value("InterZone-"),
					"product_region_code":            bigquery.Value("12345767"),
					"resource_tags_user_cluster":     bigquery.Value("12345767"),
					"resource_tags_user_component":   bigquery.Value("12345767"),
					"resource_tags_user_environment": bigquery.Value("12345767"),
					"resource_tags_user_servicetype": bigquery.Value("12345767"),
				},
				request: global.Request{
					TenantID:    12345767,
					ProjectID:   12345767,
					StartTime:   "2022-10-24 00:00:00",
					EndTime:     "2022-10-25 00:00:00",
					DataVersion: "v2",
				},
			},
			want: []*global.Item{
				{
					Labels: global.Labels{
						TenantID:    "12345767",
						ProjectID:   "12345767",
						ClusterID:   "12345767",
						ComponentID: "12345767",
						UsedBy:      "customer",
						ServiceType: "12345767",
						Provider:    "aws",
					},
					Amount:          12345767,
					Unit:            "12345767",
					Cost:            12345767,
					ResourceType:    "Network",
					ResourceSubtype: "cross_az",
					DataVersion:     "v2",
					ServiceName:     "AWSELB",
					Description:     "InterZone-",
					Location:        "12345767",
					StartTime:       "2022-10-24 00:00:00",
					EndTime:         "2022-10-25 00:00:00",
				},
			},
			wantErr: false,
		},
		{
			name: "should build ipv4 item",
			args: args{
				row: map[string]bigquery.Value{
					"resource_tags_user_tenant":      bigquery.Value("12345767"),
					"resource_tags_user_project":     bigquery.Value("12345767"),
					"resource_tags_user_usedby":      bigquery.Value("12345767"),
					"line_item_blended_cost":         bigquery.Value("12345767"),
					"line_item_unblended_cost":       bigquery.Value("12345767"),
					"line_item_usage_amount":         bigquery.Value("3"),
					"pricing_unit":                   bigquery.Value("Hrs"),
					"line_item_resource_id":          bigquery.Value("12345767"),
					"service_name":                   bigquery.Value("AWSELB:Elastic Load Balancing"),
					"line_item_operation":            bigquery.Value("LoadBalancing:Network"),
					"product_region_code":            bigquery.Value("12345767"),
					"resource_tags_user_cluster":     bigquery.Value("12345767"),
					"resource_tags_user_component":   bigquery.Value("nlb"),
					"resource_tags_user_environment": bigquery.Value("12345767"),
					"resource_tags_user_servicetype": bigquery.Value("12345767"),
				},
				request: global.Request{
					TenantID:    12345767,
					ProjectID:   12345767,
					StartTime:   "2022-10-24 00:00:00",
					EndTime:     "2022-10-25 00:00:00",
					DataVersion: "v2",
				},
			},
			want: []*global.Item{
				{
					Labels: global.Labels{
						TenantID:    "12345767",
						ProjectID:   "12345767",
						ClusterID:   "12345767",
						ComponentID: "nlb",
						UsedBy:      "customer",
						ServiceType: "12345767",
						Provider:    "aws",
					},
					Amount:          9,
					Unit:            "Hrs",
					Cost:            0.045,
					ResourceType:    "Network",
					ResourceSubtype: "ipv4",
					DataVersion:     "v2",
					ServiceName:     "AmazonVPC:Amazon Virtual Private Cloud",
					Description:     "Hourly charge for In-use Public IPv4 Addresses",
					Location:        "12345767",
					StartTime:       "2022-10-24 00:00:00",
					EndTime:         "2022-10-25 00:00:00",
				},
				{
					Labels: global.Labels{
						TenantID:    "12345767",
						ProjectID:   "12345767",
						ClusterID:   "12345767",
						ComponentID: "nlb",
						UsedBy:      "customer",
						ServiceType: "12345767",
						Provider:    "aws",
					},
					Amount:          3,
					Unit:            "Hrs",
					Cost:            12345767,
					ResourceType:    "Network",
					ResourceSubtype: "lb",
					DataVersion:     "v2",
					ServiceName:     "AWSELB:Elastic Load Balancing",
					Description:     "LoadBalancing:Network",
					Location:        "12345767",
					StartTime:       "2022-10-24 00:00:00",
					EndTime:         "2022-10-25 00:00:00",
				},
			},
			wantErr: false,
		},
		{
			name: "should work normally",
			args: args{
				row: map[string]bigquery.Value{
					"resource_tags_user_tenant":      bigquery.Value("12345767"),
					"resource_tags_user_project":     bigquery.Value("12345767"),
					"resource_tags_user_usedby":      bigquery.Value("12345767"),
					"line_item_blended_cost":         bigquery.Value("7/200000000"),
					"line_item_unblended_cost":       bigquery.Value("7/200000000"),
					"line_item_usage_amount":         bigquery.Value("3532/1000000000"),
					"pricing_unit":                   bigquery.Value("12345767"),
					"line_item_resource_id":          bigquery.Value("12345767"),
					"service_name":                   bigquery.Value("AWSELB"),
					"line_item_operation":            bigquery.Value("InterZone-"),
					"product_region_code":            bigquery.Value("12345767"),
					"resource_tags_user_cluster":     bigquery.Value("12345767"),
					"resource_tags_user_component":   bigquery.Value("12345767"),
					"resource_tags_user_environment": bigquery.Value("12345767"),
					"resource_tags_user_servicetype": bigquery.Value("12345767"),
				},
				request: global.Request{
					TenantID:    12345767,
					ProjectID:   12345767,
					StartTime:   "2022-10-24 00:00:00",
					EndTime:     "2022-10-25 00:00:00",
					DataVersion: "v2",
				},
			},
			want: []*global.Item{
				{
					Labels: global.Labels{
						TenantID:    "12345767",
						ProjectID:   "12345767",
						ClusterID:   "12345767",
						ComponentID: "12345767",
						UsedBy:      "customer",
						ServiceType: "12345767",
						Provider:    "aws",
					},
					Amount:          3.532e-06,
					Unit:            "12345767",
					Cost:            3.5e-08,
					ResourceType:    "Network",
					ResourceSubtype: "cross_az",
					DataVersion:     "v2",
					ServiceName:     "AWSELB",
					Description:     "InterZone-",
					Location:        "12345767",
					StartTime:       "2022-10-24 00:00:00",
					EndTime:         "2022-10-25 00:00:00",
				},
			},
			wantErr: false,
		},
		{
			name: "should work normally",
			args: args{
				row: map[string]bigquery.Value{
					"resource_tags_user_tenant":      bigquery.Value("12345767"),
					"resource_tags_user_project":     bigquery.Value("12345767"),
					"resource_tags_user_usedby":      bigquery.Value("12345767"),
					"line_item_blended_cost":         bigquery.Value("1.22e-07"),
					"line_item_unblended_cost":       bigquery.Value("1.22e-07"),
					"line_item_usage_amount":         bigquery.Value("2.0368100000000000002e-05"),
					"pricing_unit":                   bigquery.Value("12345767"),
					"line_item_resource_id":          bigquery.Value("12345767"),
					"service_name":                   bigquery.Value("AWSELB"),
					"line_item_operation":            bigquery.Value("InterZone-"),
					"product_region_code":            bigquery.Value("12345767"),
					"resource_tags_user_cluster":     bigquery.Value("12345767"),
					"resource_tags_user_component":   bigquery.Value("12345767"),
					"resource_tags_user_environment": bigquery.Value("12345767"),
					"resource_tags_user_servicetype": bigquery.Value("12345767"),
				},
				request: global.Request{
					TenantID:    12345767,
					ProjectID:   12345767,
					StartTime:   "2022-10-24 00:00:00",
					EndTime:     "2022-10-25 00:00:00",
					DataVersion: "v2",
				},
			},
			want: []*global.Item{
				{
					Labels: global.Labels{
						TenantID:    "12345767",
						ProjectID:   "12345767",
						ClusterID:   "12345767",
						ComponentID: "12345767",
						UsedBy:      "customer",
						ServiceType: "12345767",
						Provider:    "aws",
					},
					Amount:          2.03681e-05,
					Unit:            "12345767",
					Cost:            1.22e-07,
					ResourceType:    "Network",
					ResourceSubtype: "cross_az",
					DataVersion:     "v2",
					ServiceName:     "AWSELB",
					Description:     "InterZone-",
					Location:        "12345767",
					StartTime:       "2022-10-24 00:00:00",
					EndTime:         "2022-10-25 00:00:00",
				},
			},
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := awsDataExtract(tt.args.row, tt.args.request)
			if (err != nil) != tt.wantErr {
				t.Errorf("awsDataExtract() error = %v, wantErr %v", err, tt.wantErr)
				return
			}
			if !reflect.DeepEqual(got, tt.want) {
				t.Errorf("awsDataExtract() = %v, want %v", got, tt.want)
			}
		})
	}
}
