package git

import (
	"context"
	"fmt"
	"log"
	"net/http"
	"time"
)

// ExamplePullRequestUsage demonstrates how to use the pull request capabilities
func ExamplePullRequestUsage() {
	ctx := context.Background()

	// Example 1: GitHub Pull Requests
	exampleGitHubPullRequests(ctx)

	// Example 2: Gerrit Pull Requests
	exampleGerritPullRequests(ctx)
}

func exampleGitHubPullRequests(ctx context.Context) {
	fmt.Println("=== GitHub Pull Request Example ===")

	// Create GitHub configuration
	githubConfig := GitHubConfig{
		Token:      "your-github-token-here",
		BaseURL:    "https://api.github.com",
		HTTPClient: &http.Client{Timeout: 30 * time.Second},
	}

	// Create GitHub pull request provider
	githubProvider := NewGitHubPullRequestProvider("owner", "repo", githubConfig)

	// Create Git instance with GitHub pull request capabilities
	git := NewGitWithPullRequests("/path/to/repo", GitConfig{
		Timeout: 30 * time.Second,
	}, githubProvider)

	// Create a new pull request
	prOptions := PullRequestOptions{
		Title:       "Add new feature",
		Description: "This PR adds a new feature to the application.",
		BaseBranch:  "main",
		HeadBranch:  "feature/new-feature",
		Labels:      []string{"enhancement", "feature"},
		Assignees:   []string{"username1", "username2"},
		Reviewers:   []string{"reviewer1", "reviewer2"},
		Draft:       false,
	}

	pr, err := git.CreatePullRequest(ctx, prOptions)
	if err != nil {
		log.Printf("Failed to create pull request: %v", err)
		return
	}

	fmt.Printf("Created pull request: %s (#%d)\n", pr.Title, pr.Number)

	// List pull requests
	listOptions := ListPullRequestOptions{
		State:      "open",
		Author:     "username",
		BaseBranch: "main",
		Limit:      10,
	}

	prs, err := git.ListPullRequests(ctx, listOptions)
	if err != nil {
		log.Printf("Failed to list pull requests: %v", err)
		return
	}

	fmt.Printf("Found %d pull requests\n", len(prs))

	// Get a specific pull request
	pr, err = git.GetPullRequest(ctx, pr.ID)
	if err != nil {
		log.Printf("Failed to get pull request: %v", err)
		return
	}

	fmt.Printf("Pull request status: %s\n", pr.State)

	// Update a pull request
	updateOptions := PullRequestOptions{
		Title:       "Updated title",
		Description: "Updated description",
		Labels:      []string{"bug", "urgent"},
	}

	updatedPR, err := git.UpdatePullRequest(ctx, pr.ID, updateOptions)
	if err != nil {
		log.Printf("Failed to update pull request: %v", err)
		return
	}

	fmt.Printf("Updated pull request: %s\n", updatedPR.Title)

	// Merge a pull request
	mergeOptions := MergePullRequestOptions{
		MergeMethod: "squash",
		CommitTitle: "Merge pull request #123",
		CommitMsg:   "This merges the feature branch into main",
	}

	err = git.MergePullRequest(ctx, pr.ID, mergeOptions)
	if err != nil {
		log.Printf("Failed to merge pull request: %v", err)
		return
	}

	fmt.Println("Pull request merged successfully")
}

func exampleGerritPullRequests(ctx context.Context) {
	fmt.Println("=== Gerrit Pull Request Example ===")

	// Create Gerrit configuration
	gerritConfig := GerritConfig{
		Username:   "your-username",
		Password:   "your-http-password-or-api-token",
		BaseURL:    "https://gerrit.example.com",
		HTTPClient: &http.Client{Timeout: 30 * time.Second},
	}

	// Create Gerrit pull request provider
	gerritProvider := NewGerritPullRequestProvider("project-name", gerritConfig)

	// Create Git instance with Gerrit pull request capabilities
	git := NewGitWithPullRequests("/path/to/repo", GitConfig{
		Timeout: 30 * time.Second,
	}, gerritProvider)

	// Create a new change (pull request)
	prOptions := PullRequestOptions{
		Title:       "Add new feature",
		Description: "This change adds a new feature to the application.",
		BaseBranch:  "master",
		HeadBranch:  "feature/new-feature",
	}

	pr, err := git.CreatePullRequest(ctx, prOptions)
	if err != nil {
		log.Printf("Failed to create change: %v", err)
		return
	}

	fmt.Printf("Created change: %s (#%d)\n", pr.Title, pr.Number)

	// List changes
	listOptions := ListPullRequestOptions{
		State:      "open",
		Author:     "username",
		BaseBranch: "master",
		Limit:      10,
	}

	prs, err := git.ListPullRequests(ctx, listOptions)
	if err != nil {
		log.Printf("Failed to list changes: %v", err)
		return
	}

	fmt.Printf("Found %d changes\n", len(prs))

	// Get a specific change
	pr, err = git.GetPullRequest(ctx, pr.ID)
	if err != nil {
		log.Printf("Failed to get change: %v", err)
		return
	}

	fmt.Printf("Change status: %s\n", pr.State)

	// Update a change
	updateOptions := PullRequestOptions{
		Title:       "Updated title",
		Description: "Updated description",
	}

	updatedPR, err := git.UpdatePullRequest(ctx, pr.ID, updateOptions)
	if err != nil {
		log.Printf("Failed to update change: %v", err)
		return
	}

	fmt.Printf("Updated change: %s\n", updatedPR.Title)

	// Submit a change (merge)
	mergeOptions := MergePullRequestOptions{
		CommitTitle: "Submit change",
		CommitMsg:   "This submits the change to master",
	}

	err = git.MergePullRequest(ctx, pr.ID, mergeOptions)
	if err != nil {
		log.Printf("Failed to submit change: %v", err)
		return
	}

	fmt.Println("Change submitted successfully")
}

// Example of using both providers in the same application
func ExampleMultiProviderUsage() {
	ctx := context.Background()

	// Determine which provider to use based on configuration
	useGitHub := true // This could come from config

	var git GitInterface

	if useGitHub {
		// Use GitHub
		githubConfig := GitHubConfig{
			Token:   "github-token",
			BaseURL: "https://api.github.com",
		}
		githubProvider := NewGitHubPullRequestProvider("owner", "repo", githubConfig)
		git = NewGitWithPullRequests("/path/to/repo", GitConfig{}, githubProvider)
	} else {
		// Use Gerrit
		gerritConfig := GerritConfig{
			Username: "gerrit-username",
			Password: "gerrit-password",
			BaseURL:  "https://gerrit.example.com",
		}
		gerritProvider := NewGerritPullRequestProvider("project", gerritConfig)
		git = NewGitWithPullRequests("/path/to/repo", GitConfig{}, gerritProvider)
	}

	// Use the same interface regardless of provider
	prOptions := PullRequestOptions{
		Title:       "Cross-platform PR",
		Description: "This works with both GitHub and Gerrit",
		BaseBranch:  "main",
		HeadBranch:  "feature/cross-platform",
	}

	pr, err := git.CreatePullRequest(ctx, prOptions)
	if err != nil {
		log.Printf("Failed to create pull request: %v", err)
		return
	}

	fmt.Printf("Created pull request: %s\n", pr.Title)
}
