package integration

import (
	"bytes"
	"encoding/json"
	"net/http"
	"time"

	"github.com/containous/traefik/integration/try"
	"github.com/containous/traefik/pkg/config"
	"github.com/go-check/check"
	checker "github.com/vdemeester/shakers"
)

type RestSuite struct{ BaseSuite }

func (s *RestSuite) SetUpSuite(c *check.C) {
	s.createComposeProject(c, "rest")

	s.composeProject.Start(c)
}

func (s *RestSuite) TestSimpleConfiguration(c *check.C) {
	cmd, display := s.traefikCmd(withConfigFile("fixtures/rest/simple.toml"))

	defer display(c)
	err := cmd.Start()
	c.Assert(err, checker.IsNil)
	defer cmd.Process.Kill()

	// Expected a 404 as we did not configure anything.
	err = try.GetRequest("http://127.0.0.1:8000/", 1000*time.Millisecond, try.StatusCodeIs(http.StatusNotFound))
	c.Assert(err, checker.IsNil)

	config := config.HTTPConfiguration{
		Routers: map[string]*config.Router{
			"router1": {
				EntryPoints: []string{"web"},
				Middlewares: []string{},
				Service:     "service1",
				Rule:        "PathPrefix(`/`)",
			},
		},
		Services: map[string]*config.Service{
			"service1": {
				LoadBalancer: &config.LoadBalancerService{
					Servers: []config.Server{
						{
							URL: "http://" + s.composeProject.Container(c, "whoami1").NetworkSettings.IPAddress + ":80",
						},
					},
				},
			},
		},
	}

	json, err := json.Marshal(config)
	c.Assert(err, checker.IsNil)

	request, err := http.NewRequest(http.MethodPut, "http://127.0.0.1:8080/api/providers/rest", bytes.NewReader(json))
	c.Assert(err, checker.IsNil)

	response, err := http.DefaultClient.Do(request)
	c.Assert(err, checker.IsNil)
	c.Assert(response.StatusCode, checker.Equals, http.StatusOK)

	err = try.GetRequest("http://127.0.0.1:8080/api/rawdata", 1000*time.Millisecond, try.BodyContains("PathPrefix(`/`)"))
	c.Assert(err, checker.IsNil)

	err = try.GetRequest("http://127.0.0.1:8000/", 1000*time.Millisecond, try.StatusCodeIs(http.StatusOK))
	c.Assert(err, checker.IsNil)
}
