package plicflix

import (
	"context"
	"net/http"
	"net/http/httptest"
	"net/url"
	"strings"
	"testing"
)

func TestTrocar(t *testing.T) {
	api := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if r.URL.Path != "/v1/ingresso/trocar" || r.Header.Get("Authorization") != "Bearer pk_teste" {
			w.WriteHeader(http.StatusUnauthorized)
			return
		}
		w.Write([]byte(`{"jogador":{"id":"pf_abc","nome":"Paulo"},"jogo":"meu-jogo","partida":"pt_1","assinante":true,"contexto":{"ref":"plicflix","idioma":"pt-BR","plataforma":"web"}}`))
	}))
	defer api.Close()
	r, err := Novo("pk_teste", api.URL).Trocar(context.Background(), "pft_x")
	if err != nil || r.Jogador.ID != "pf_abc" || r.Jogador.Nome != "Paulo" || r.Contexto.Ref != "plicflix" {
		t.Fatalf("%+v %v", r, err)
	}
	if _, err := Novo("pk_errada", api.URL).Trocar(context.Background(), "pft_x"); err != ErrToken {
		t.Fatalf("chave errada: %v", err)
	}
	if _, err := Novo("pk_teste", api.URL).Trocar(context.Background(), "lixo"); err != ErrToken {
		t.Fatalf("token sem formato: %v", err)
	}
}

func TestOAuth(t *testing.T) {
	pk := NovoPKCE()
	u, _ := url.Parse(URLDeEntrada("meu-jogo", "https://j.test/volta", pk))
	if u.Path != "/oauth/authorize" || u.Query().Get("code_challenge") != pk.Desafio || u.Query().Get("state") != pk.Estado {
		t.Fatalf("url: %s", u)
	}
	api := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		_ = r.ParseForm()
		if r.URL.Path != "/v1/oauth/token" || r.PostForm.Get("code_verifier") != pk.Verificador || !strings.HasPrefix(r.PostForm.Get("code"), "pfc_") {
			w.WriteHeader(http.StatusBadRequest)
			return
		}
		w.Write([]byte(`{"jogador":{"id":"pf_abc","nome":"Paulo"},"jogo":"meu-jogo","assinante":false,"access_token":"pfa_x","expires_in":3600}`))
	}))
	defer api.Close()
	e, err := Novo("pk_teste", api.URL).TrocarCodigo(context.Background(), "meu-jogo", "pfc_1", "https://j.test/volta", pk.Verificador)
	if err != nil || e.Jogador.ID != "pf_abc" {
		t.Fatalf("%+v %v", e, err)
	}
	if _, err := Novo("pk_teste", api.URL).TrocarCodigo(context.Background(), "meu-jogo", "pfc_1", "https://j.test/volta", "outro"); err != ErrCodigo {
		t.Fatalf("verificador errado: %v", err)
	}
}
