package scraper

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

func TestOpenAPIScraperScrape(t *testing.T) {
	spec := `{
  "openapi": "3.0.0",
  "info": {"title": "Pet API", "version": "1.0.0"},
  "paths": {
    "/pets": {
      "get": {
        "summary": "List pets",
        "operationId": "listPets",
        "responses": {"200": {"description": "ok"}}
      }
    }
  }
}`

	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, _ = w.Write([]byte(spec))
	}))
	defer srv.Close()

	s := NewOpenAPIScraper(&Config{Timeout: 2 * time.Second, UserAgent: "DevourTest"})
	docs, err := s.Scrape(context.Background(), &Source{Name: "pet", Type: SourceTypeOpenAPI, URL: srv.URL})
	if err != nil {
		t.Fatalf("unexpected scrape error: %v", err)
	}
	if len(docs) < 2 {
		t.Fatalf("expected at least 2 docs, got %d", len(docs))
	}
	foundOp := false
	for _, d := range docs {
		if strings.Contains(d.Title, "List pets") {
			foundOp = true
			break
		}
	}
	if !foundOp {
		t.Fatal("expected operation document")
	}
}

func TestOpenAPIScraperDetectChanges(t *testing.T) {
	spec := `{"openapi":"3.0.0","info":{"title":"API"},"paths":{}}`
	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		_, _ = w.Write([]byte(spec))
	}))
	defer srv.Close()

	s := NewOpenAPIScraper(&Config{Timeout: 2 * time.Second, UserAgent: "DevourTest"})
	src := &Source{Name: "api", Type: SourceTypeOpenAPI, URL: srv.URL}
	changed, hash1, err := s.DetectChanges(context.Background(), src, "")
	if err != nil {
		t.Fatal(err)
	}
	if !changed || hash1 == "" {
		t.Fatalf("expected changed=true and non-empty hash, changed=%v hash=%q", changed, hash1)
	}

	changed, _, err = s.DetectChanges(context.Background(), src, hash1)
	if err != nil {
		t.Fatal(err)
	}
	if changed {
		t.Fatal("expected no changes when hash matches")
	}
}
