package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"net/http/httptest"
	"os"
	"testing"
)

func TestSegmentCleanup(t *testing.T) {
	sourceSegment := "<seg>This is test</seg>"
	targetSegment := "<seg>This is test for target</seg>"

	cleanedSourceSegment := "This is test"
	cleanedTargetSegment := "This is test for target"

	segment := Segment{sourceSegment, targetSegment}
	segment.Clean()

	t.Log("Testing if <seg> tags will be removed from segments.")
	if segment.Source == cleanedSourceSegment && segment.Target == cleanedTargetSegment {
		t.Log("Segments have been cleaned!")
	} else {
		t.Fatalf("Segments still have tags!\nSource: %v\nTarget: %v", segment.Source, segment.Target)
	}
}

func ServeSearchResults() *httptest.Server {
	searchResults, err := ioutil.ReadFile("./testFiles/searchResults.json")
	if err != nil {
		log.Fatalf("Error reading file: %v\n", err)
	}

	f := func(w http.ResponseWriter, r *http.Request) {
		w.WriteHeader(200)
		w.Header().Set("Content-Type", "application/json")
		fmt.Fprintln(w, string(searchResults))
	}

	return httptest.NewServer(http.HandlerFunc(f))
}

func TestSearch(t *testing.T) {
	server := ServeSearchResults()
	defer server.Close()

	var app Application
	app.SetBaseURL(server.URL)

	tmsJSON, err := os.Open("./testFiles/tms.json")
	defer tmsJSON.Close()
	if err != nil {
		t.Fatalf("error reading tms: %v", err)
		return
	}

	var tms []TM
	JSONDecoder(tmsJSON, &tms)

	testSourceSegment1 := "<bpt i='1' type='bold'>{}</bpt>Something Test/ Whatever<ept i='1'>{}</ept>"
	testSourceSegment2 := "<bpt i='1' type='bold'>{}</bpt>Another Test/ Anything<ept i='1'>{}</ept>"

	t.Log("Testing search method.")
	searchResults := app.Search(tms, "something")
	if searchResults.TotalResults != 4 {
		t.Fatalf("Not all results returned! (%v)", searchResults.TotalResults)
	}

	segment := searchResults.Results[0].Segments[0]
	if segment.Source == testSourceSegment1 || segment.Source == testSourceSegment2 {
		t.Log("Search results fine!")
	} else {
		t.Fatalf("Something is wrong with returned segment!\n%v", segment)
	}
}