package gophercloud

import (
	"bytes"
	"errors"
	"io"
	"net/http"
	"reflect"
	"testing"

	"github.com/mitchellh/mapstructure"
)

type nopCloser struct {
	io.Reader
}

func (nopCloser) Close() error { return nil }

func responseWithBody(body string) (http.Response, error) {
	return http.Response{
		Body: nopCloser{bytes.NewReader([]byte(body))},
	}, nil
}

// SinglePage sample and test cases.

func ExtractSingleInts(page Page) ([]int, error) {
	var response struct {
		Ints []int `mapstructure:"ints"`
	}

	err := mapstructure.Decode(page.(SinglePage).Body, &response)
	if err != nil {
		return nil, err
	}

	return response.Ints, nil
}

func setupSinglePaged() Pager {
	return NewSinglePager(func() (http.Response, error) {
		return responseWithBody(`{ "ints": [1, 2, 3] }`)
	})
}

func TestEnumerateSinglePaged(t *testing.T) {
	callCount := 0
	err := setupSinglePaged().EachPage(func(page Page) (bool, error) {
		callCount++

		expected := []int{1, 2, 3}
		actual, err := ExtractSingleInts(page)
		if err != nil {
			return false, err
		}
		if !reflect.DeepEqual(expected, actual) {
			t.Errorf("Expected %v, but was %v", expected, actual)
		}
		return true, nil
	})
	if err != nil {
		t.Fatalf("Unexpected error calling EachPage: %v", err)
	}

	if callCount != 1 {
		t.Errorf("Callback was invoked %d times", callCount)
	}
}

// LinkedPager sample and test cases.

func ExtractLinkedInts(page Page) ([]int, error) {
	var response struct {
		Ints []int `mapstructure:"ints"`
	}

	err := mapstructure.Decode(page.(LinkedPage).Body, &response)
	if err != nil {
		return nil, err
	}

	return response.Ints, nil
}

func createLinked(t *testing.T) Pager {
	return NewLinkedPager("page1", func(url string) (http.Response, error) {
		switch url {
		case "page1":
			return responseWithBody(`{ "ints": [1, 2, 3], "links": { "next": "page2" } }`)
		case "page2":
			return responseWithBody(`{ "ints": [4, 5, 6], "links": { "next": "page3" } }`)
		case "page3":
			return responseWithBody(`{ "ints": [7, 8, 9], "links": { "next": null } }`)
		default:
			t.Fatalf("LinkedPager called with unexpected URL: %v", url)
			return http.Response{}, errors.New("Wat")
		}
	})
}

func TestEnumerateLinked(t *testing.T) {
	pager := createLinked(t)

	callCount := 0
	err := pager.EachPage(func(page Page) (bool, error) {
		actual, err := ExtractLinkedInts(page)
		if err != nil {
			return false, err
		}

		t.Logf("Handler invoked with %v", actual)

		var expected []int
		switch callCount {
		case 0:
			expected = []int{1, 2, 3}
		case 1:
			expected = []int{4, 5, 6}
		case 2:
			expected = []int{7, 8, 9}
		default:
			t.Fatalf("Unexpected call count: %d", callCount)
			return false, nil
		}

		if !reflect.DeepEqual(expected, actual) {
			t.Errorf("Call %d: Expected %#v, but was %#v", callCount, expected, actual)
		}

		callCount++
		return true, nil
	})
	if err != nil {
		t.Errorf("Unexpected error for page iteration: %v", err)
	}

	if callCount != 3 {
		t.Errorf("Expected 3 calls, but was %d", callCount)
	}
}
