// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package cmrdr

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestReplace(t *testing.T) {
	validStream1 := Stream{
		Device:  "fakeDevice",
		Address: "fakeAddress",
		Port:    1337,
	}

	validStream2 := Stream{
		Device:  "fakeDevice",
		Address: "differentFakeAddress",
		Port:    1337,
	}

	invalidStreamNoPort := Stream{
		Device:  "invalidDevice",
		Address: "fakeAddress",
		Port:    0,
	}

	invalidStreamNoPortModified := Stream{
		Device:  "updatedDevice",
		Address: "fakeAddress",
		Port:    1337,
	}

	vectors := []struct {
		streams   []Stream
		newStream Stream

		expectedStreams []Stream
	}{
		// Valid baseline
		{
			streams:   []Stream{validStream1, validStream2, invalidStreamNoPort},
			newStream: invalidStreamNoPortModified,

			expectedStreams: []Stream{validStream1, validStream2, invalidStreamNoPortModified},
		},
	}
	for _, vector := range vectors {
		streams := replace(vector.streams, vector.newStream)

		for _, stream := range vector.streams {
			foundStream := false
			for _, result := range streams {
				if result.Address == stream.Address && result.Device == stream.Device && result.Port == stream.Port {
					foundStream = true
				}
			}
			assert.Equal(t, true, foundStream, "wrong streams parsed")
		}
	}
}

func TestGetCameraRTSPURL(t *testing.T) {
	validStream := Stream{
		Address:  "1.2.3.4",
		Username: "ullaakut",
		Password: "ba69897483886f0d2b0afb6345b76c0c",
		Route:    "cameradar.sdp",
		Port:     1337,
	}

	vectors := []struct {
		stream Stream

		expectedRTSPURL string
	}{
		// Valid baseline
		{
			stream: validStream,

			expectedRTSPURL: "rtsp://ullaakut:ba69897483886f0d2b0afb6345b76c0c@1.2.3.4:1337/cameradar.sdp",
		},
	}
	for _, vector := range vectors {
		output := GetCameraRTSPURL(vector.stream)
		assert.Equal(t, vector.expectedRTSPURL, output, "wrong RTSP URL generated")
	}
}

func TestGetCameraAdminPanelURL(t *testing.T) {
	validStream := Stream{
		Address: "1.2.3.4",
	}

	vectors := []struct {
		stream Stream

		expectedRTSPURL string
	}{
		// Valid baseline
		{
			stream: validStream,

			expectedRTSPURL: "http://1.2.3.4/",
		},
	}
	for _, vector := range vectors {
		output := GetCameraAdminPanelURL(vector.stream)
		assert.Equal(t, vector.expectedRTSPURL, output, "wrong Admin Panel URL generated")
	}
}
