package git

import (
	"bytes"
	"context"
	"encoding/json"
	"fmt"
	"log/slog"
	"net/http"
	"strconv"
	"strings"
	"time"
)

// GerritConfig holds configuration for Gerrit operations
type GerritConfig struct {
	Username   string
	Password   string // Can be HTTP password or API token
	BaseURL    string
	HTTPClient *http.Client
	Logger     *slog.Logger
}

// GerritPullRequestProvider implements PullRequestProvider for Gerrit
type GerritPullRequestProvider struct {
	config  GerritConfig
	project string
	logger  *slog.Logger
}

// NewGerritPullRequestProvider creates a new Gerrit pull request provider
func NewGerritPullRequestProvider(project string, config GerritConfig) PullRequestProvider {
	if config.HTTPClient == nil {
		config.HTTPClient = &http.Client{Timeout: 30 * time.Second}
	}
	if config.Logger == nil {
		config.Logger = slog.Default()
	}

	return &GerritPullRequestProvider{
		config:  config,
		project: project,
		logger:  config.Logger,
	}
}

// Gerrit API response types
type gerritChange struct {
	ID              string                     `json:"id"`
	Number          int                        `json:"_number"`
	Subject         string                     `json:"subject"`
	Description     string                     `json:"description"`
	Status          string                     `json:"status"`
	Owner           gerritAccount              `json:"owner"`
	Created         time.Time                  `json:"created"`
	Updated         time.Time                  `json:"updated"`
	Branch          string                     `json:"branch"`
	Topic           string                     `json:"topic"`
	Labels          map[string]gerritLabelInfo `json:"labels"`
	Reviewers       map[string][]gerritAccount `json:"reviewers"`
	CurrentRevision string                     `json:"current_revision"`
	Revisions       map[string]gerritRevision  `json:"revisions"`
	Messages        []gerritMessage            `json:"messages"`
}

type gerritAccount struct {
	AccountID int    `json:"_account_id"`
	Name      string `json:"name"`
	Email     string `json:"email"`
	Username  string `json:"username"`
}

type gerritLabelInfo struct {
	All []gerritApproval `json:"all"`
}

type gerritApproval struct {
	AccountID int    `json:"_account_id"`
	Name      string `json:"name"`
	Email     string `json:"email"`
	Value     int    `json:"value"`
}

type gerritRevision struct {
	Number int                        `json:"_number"`
	Ref    string                     `json:"ref"`
	Fetch  map[string]gerritFetchInfo `json:"fetch"`
	Commit gerritCommit               `json:"commit"`
	Files  map[string]gerritFileInfo  `json:"files"`
}

type gerritFetchInfo struct {
	URL string `json:"url"`
	Ref string `json:"ref"`
}

type gerritCommit struct {
	Subject string       `json:"subject"`
	Message string       `json:"message"`
	Author  gerritPerson `json:"author"`
}

type gerritPerson struct {
	Name  string `json:"name"`
	Email string `json:"email"`
	Date  string `json:"date"`
}

type gerritFileInfo struct {
	Status        string `json:"status"`
	LinesInserted int    `json:"lines_inserted"`
	LinesDeleted  int    `json:"lines_deleted"`
}

type gerritMessage struct {
	ID             string        `json:"id"`
	Author         gerritAccount `json:"author"`
	Message        string        `json:"message"`
	Date           time.Time     `json:"date"`
	RevisionNumber int           `json:"_revision_number"`
}

type gerritCreateChangeRequest struct {
	Project     string `json:"project"`
	Subject     string `json:"subject"`
	Description string `json:"description"`
	Branch      string `json:"branch"`
	Topic       string `json:"topic,omitempty"`
	Base        string `json:"base,omitempty"`
}

type gerritUpdateChangeRequest struct {
	Subject     string `json:"subject,omitempty"`
	Description string `json:"description,omitempty"`
	Topic       string `json:"topic,omitempty"`
	Status      string `json:"status,omitempty"`
}

// CreatePullRequest creates a new change (pull request) on Gerrit
func (g *GerritPullRequestProvider) CreatePullRequest(ctx context.Context, options PullRequestOptions) (*PullRequest, error) {
	reqBody := gerritCreateChangeRequest{
		Project:     g.project,
		Subject:     options.Title,
		Description: options.Description,
		Branch:      options.BaseBranch,
		Topic:       options.HeadBranch, // Use head branch as topic
	}

	jsonBody, err := json.Marshal(reqBody)
	if err != nil {
		return nil, fmt.Errorf("failed to marshal request body: %w", err)
	}

	url := fmt.Sprintf("%s/a/changes/", g.config.BaseURL)

	// Log change creation with structured data
	g.logger.Info("Creating Gerrit change",
		slog.String("url", url),
		slog.String("project", g.project),
		slog.String("subject", options.Title),
		slog.String("branch", options.BaseBranch),
		slog.String("topic", options.HeadBranch))
	req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(jsonBody))
	if err != nil {
		return nil, fmt.Errorf("failed to create request: %w", err)
	}

	req.SetBasicAuth(g.config.Username, g.config.Password)
	req.Header.Set("Content-Type", "application/json")

	resp, err := g.config.HTTPClient.Do(req)
	if err != nil {
		return nil, fmt.Errorf("failed to make request: %w", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusCreated {
		return nil, fmt.Errorf("gerrit API error: %d", resp.StatusCode)
	}

	// Gerrit returns the change ID in the response body
	var changeID string
	if err := json.NewDecoder(resp.Body).Decode(&changeID); err != nil {
		return nil, fmt.Errorf("failed to decode response: %w", err)
	}

	// Remove the ")]}'" prefix that Gerrit adds to responses
	changeID = strings.TrimPrefix(changeID, ")]}'")

	// Fetch the created change
	return g.GetPullRequest(ctx, changeID)
}

// GetPullRequest retrieves a change by ID
func (g *GerritPullRequestProvider) GetPullRequest(ctx context.Context, id string) (*PullRequest, error) {
	url := fmt.Sprintf("%s/a/changes/%s?o=DETAILED_ACCOUNTS&o=DETAILED_LABELS&o=MESSAGES&o=CURRENT_REVISION&o=CURRENT_COMMIT", g.config.BaseURL, id)
	req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
	if err != nil {
		return nil, fmt.Errorf("failed to create request: %w", err)
	}

	req.SetBasicAuth(g.config.Username, g.config.Password)

	resp, err := g.config.HTTPClient.Do(req)
	if err != nil {
		return nil, fmt.Errorf("failed to make request: %w", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("gerrit API error: %d", resp.StatusCode)
	}

	// Read and remove Gerrit's ")]}'" prefix
	body := make([]byte, 4)
	if _, err := resp.Body.Read(body); err != nil {
		return nil, fmt.Errorf("failed to read response prefix: %w", err)
	}
	if string(body) != ")]}'" {
		return nil, fmt.Errorf("unexpected response prefix: %s", string(body))
	}

	var gerritChange gerritChange
	if err := json.NewDecoder(resp.Body).Decode(&gerritChange); err != nil {
		return nil, fmt.Errorf("failed to decode response: %w", err)
	}

	return g.convertGerritChange(gerritChange), nil
}

// ListPullRequests lists changes
func (g *GerritPullRequestProvider) ListPullRequests(ctx context.Context, options ListPullRequestOptions) ([]PullRequest, error) {
	url := fmt.Sprintf("%s/a/changes/", g.config.BaseURL)
	req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
	if err != nil {
		return nil, fmt.Errorf("failed to create request: %w", err)
	}

	// Add query parameters
	q := req.URL.Query()
	q.Add("q", fmt.Sprintf("project:%s", g.project))

	if options.State != "" {
		switch options.State {
		case "open":
			q.Add("q", "status:open")
		case "closed":
			q.Add("q", "status:closed")
		}
	}
	if options.Author != "" {
		q.Add("q", fmt.Sprintf("owner:%s", options.Author))
	}
	if options.Assignee != "" {
		q.Add("q", fmt.Sprintf("reviewer:%s", options.Assignee))
	}
	if options.BaseBranch != "" {
		q.Add("q", fmt.Sprintf("branch:%s", options.BaseBranch))
	}
	if options.Limit > 0 {
		q.Add("n", strconv.Itoa(options.Limit))
	}
	req.URL.RawQuery = q.Encode()

	req.SetBasicAuth(g.config.Username, g.config.Password)

	resp, err := g.config.HTTPClient.Do(req)
	if err != nil {
		return nil, fmt.Errorf("failed to make request: %w", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("gerrit API error: %d", resp.StatusCode)
	}

	// Read and remove Gerrit's ")]}'" prefix
	body := make([]byte, 4)
	if _, err := resp.Body.Read(body); err != nil {
		return nil, fmt.Errorf("failed to read response prefix: %w", err)
	}
	if string(body) != ")]}'" {
		return nil, fmt.Errorf("unexpected response prefix: %s", string(body))
	}

	var gerritChanges []gerritChange
	if err := json.NewDecoder(resp.Body).Decode(&gerritChanges); err != nil {
		return nil, fmt.Errorf("failed to decode response: %w", err)
	}

	prs := make([]PullRequest, len(gerritChanges))
	for i, change := range gerritChanges {
		prs[i] = *g.convertGerritChange(change)
	}

	return prs, nil
}

// UpdatePullRequest updates a change
func (g *GerritPullRequestProvider) UpdatePullRequest(ctx context.Context, id string, options PullRequestOptions) (*PullRequest, error) {
	reqBody := gerritUpdateChangeRequest{
		Subject:     options.Title,
		Description: options.Description,
	}

	jsonBody, err := json.Marshal(reqBody)
	if err != nil {
		return nil, fmt.Errorf("failed to marshal request body: %w", err)
	}

	url := fmt.Sprintf("%s/a/changes/%s", g.config.BaseURL, id)
	req, err := http.NewRequestWithContext(ctx, "PUT", url, bytes.NewBuffer(jsonBody))
	if err != nil {
		return nil, fmt.Errorf("failed to create request: %w", err)
	}

	req.SetBasicAuth(g.config.Username, g.config.Password)
	req.Header.Set("Content-Type", "application/json")

	resp, err := g.config.HTTPClient.Do(req)
	if err != nil {
		return nil, fmt.Errorf("failed to make request: %w", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return nil, fmt.Errorf("gerrit API error: %d", resp.StatusCode)
	}

	// Fetch the updated change
	return g.GetPullRequest(ctx, id)
}

// ClosePullRequest closes a change
func (g *GerritPullRequestProvider) ClosePullRequest(ctx context.Context, id string) error {
	reqBody := gerritUpdateChangeRequest{
		Status: "ABANDONED",
	}

	jsonBody, err := json.Marshal(reqBody)
	if err != nil {
		return fmt.Errorf("failed to marshal request body: %w", err)
	}

	url := fmt.Sprintf("%s/a/changes/%s/abandon", g.config.BaseURL, id)
	req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(jsonBody))
	if err != nil {
		return fmt.Errorf("failed to create request: %w", err)
	}

	req.SetBasicAuth(g.config.Username, g.config.Password)
	req.Header.Set("Content-Type", "application/json")

	resp, err := g.config.HTTPClient.Do(req)
	if err != nil {
		return fmt.Errorf("failed to make request: %w", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("gerrit API error: %d", resp.StatusCode)
	}

	return nil
}

// MergePullRequest merges a change
func (g *GerritPullRequestProvider) MergePullRequest(ctx context.Context, id string, options MergePullRequestOptions) error {
	url := fmt.Sprintf("%s/a/changes/%s/submit", g.config.BaseURL, id)
	req, err := http.NewRequestWithContext(ctx, "POST", url, nil)
	if err != nil {
		return fmt.Errorf("failed to create request: %w", err)
	}

	req.SetBasicAuth(g.config.Username, g.config.Password)

	resp, err := g.config.HTTPClient.Do(req)
	if err != nil {
		return fmt.Errorf("failed to make request: %w", err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		return fmt.Errorf("gerrit API error: %d", resp.StatusCode)
	}

	return nil
}

// convertGerritChange converts a Gerrit change to our PullRequest type
func (g *GerritPullRequestProvider) convertGerritChange(change gerritChange) *PullRequest {
	// Extract labels
	var labels []string
	for labelName := range change.Labels {
		labels = append(labels, labelName)
	}

	// Extract reviewers
	var reviewers []Author
	if reviewersMap, exists := change.Reviewers["REVIEWER"]; exists {
		for _, reviewer := range reviewersMap {
			reviewers = append(reviewers, Author{
				Name:  reviewer.Name,
				Email: reviewer.Email,
			})
		}
	}

	// Extract comments from messages
	var comments []PullRequestComment
	for _, message := range change.Messages {
		if message.Message != "" {
			comments = append(comments, PullRequestComment{
				ID: message.ID,
				Author: Author{
					Name:  message.Author.Name,
					Email: message.Author.Email,
				},
				Content:   message.Message,
				CreatedAt: message.Date,
				UpdatedAt: message.Date,
			})
		}
	}

	// Determine state
	state := "open"
	switch change.Status {
	case "MERGED":
		state = "merged"
	case "ABANDONED":
		state = "closed"
	}

	return &PullRequest{
		ID:          change.ID,
		Number:      change.Number,
		Title:       change.Subject,
		Description: change.Description,
		State:       state,
		Author: Author{
			Name:  change.Owner.Name,
			Email: change.Owner.Email,
		},
		CreatedAt:  change.Created,
		UpdatedAt:  change.Updated,
		BaseBranch: change.Branch,
		HeadBranch: change.Topic, // Use topic as head branch
		BaseRepo:   g.project,
		HeadRepo:   g.project, // Gerrit changes are within the same project
		Labels:     labels,
		Assignees:  []Author{}, // Gerrit doesn't have assignees in the same way
		Reviewers:  reviewers,
		Commits:    []Commit{}, // Would need additional API call to populate
		Comments:   comments,
	}
}
