package gcs

import (
	"bytes"
	"context"
	"io"
	"net/http"
	"net/http/httptest"
	"strings"
	"testing"
)

func TestStoreRoundTrip(t *testing.T) {
	var uploaded []byte
	mux := http.NewServeMux()
	mux.HandleFunc("/upload/storage/v1/b/", func(w http.ResponseWriter, r *http.Request) {
		if r.URL.Query().Get("uploadType") != "media" {
			http.Error(w, "bad uploadType", http.StatusBadRequest)
			return
		}
		body, _ := io.ReadAll(r.Body)
		uploaded = body
		w.WriteHeader(http.StatusOK)
	})
	mux.HandleFunc("/storage/v1/b/", func(w http.ResponseWriter, r *http.Request) {
		switch r.Method {
		case http.MethodGet:
			if r.URL.Query().Get("alt") != "media" {
				http.Error(w, "alt", http.StatusBadRequest)
				return
			}
			_, _ = w.Write(uploaded)
		case http.MethodDelete:
			w.WriteHeader(http.StatusNoContent)
		}
	})

	srv := httptest.NewServer(mux)
	defer srv.Close()

	store := New(srv.URL, "ains-dev")
	ctx := context.Background()

	if err := store.Upload(ctx, "ebook/abc.pdf", strings.NewReader("PDFDATA"), "application/pdf"); err != nil {
		t.Fatal(err)
	}
	if string(uploaded) != "PDFDATA" {
		t.Fatalf("uploaded = %q", uploaded)
	}

	rc, err := store.Open(ctx, "ebook/abc.pdf")
	if err != nil {
		t.Fatal(err)
	}
	defer func() { _ = rc.Close() }()
	got, _ := io.ReadAll(rc)
	if !bytes.Equal(got, []byte("PDFDATA")) {
		t.Fatalf("open = %q", got)
	}

	if err := store.Delete(ctx, "ebook/abc.pdf"); err != nil {
		t.Fatal(err)
	}

	url, err := store.DownloadURL(ctx, "ebook/abc.pdf", 0)
	if err != nil {
		t.Fatal(err)
	}
	if !strings.HasSuffix(url, "?alt=media") {
		t.Fatalf("download url = %q", url)
	}
}
