package git

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

// GitHubConfig holds configuration for GitHub operations
type GitHubConfig struct {
	Token      string
	BaseURL    string // Default: https://api.github.com
	HTTPClient *http.Client
	Logger     *slog.Logger
}

// GitHubPullRequestProvider implements PullRequestProvider for GitHub
type GitHubPullRequestProvider struct {
	config GitHubConfig
	owner  string
	repo   string
	logger *slog.Logger
}

// NewGitHubPullRequestProvider creates a new GitHub pull request provider
func NewGitHubPullRequestProvider(owner, repo string, config GitHubConfig) PullRequestProvider {
	if config.BaseURL == "" {
		config.BaseURL = "https://api.github.com"
	}
	if config.HTTPClient == nil {
		config.HTTPClient = &http.Client{Timeout: 30 * time.Second}
	}
	if config.Logger == nil {
		config.Logger = slog.Default()
	}

	return &GitHubPullRequestProvider{
		config: config,
		owner:  owner,
		repo:   repo,
		logger: config.Logger,
	}
}

// GitHub API response types
type githubPullRequest struct {
	ID                 int           `json:"id"`
	Number             int           `json:"number"`
	Title              string        `json:"title"`
	Body               string        `json:"body"`
	State              string        `json:"state"`
	User               githubUser    `json:"user"`
	CreatedAt          time.Time     `json:"created_at"`
	UpdatedAt          time.Time     `json:"updated_at"`
	Base               githubBranch  `json:"base"`
	Head               githubBranch  `json:"head"`
	Labels             []githubLabel `json:"labels"`
	Assignees          []githubUser  `json:"assignees"`
	RequestedReviewers []githubUser  `json:"requested_reviewers"`
	CommitsURL         string        `json:"commits_url"`
	CommentsURL        string        `json:"comments_url"`
}

type githubUser struct {
	Login string `json:"login"`
	ID    int    `json:"id"`
	Type  string `json:"type"`
}

type githubBranch struct {
	Ref  string     `json:"ref"`
	SHA  string     `json:"sha"`
	Repo githubRepo `json:"repo"`
}

type githubRepo struct {
	FullName string `json:"full_name"`
}

type githubLabel struct {
	Name  string `json:"name"`
	Color string `json:"color"`
}

type githubCreatePRRequest struct {
	Title     string   `json:"title"`
	Body      string   `json:"body"`
	Head      string   `json:"head"`
	Base      string   `json:"base"`
	Labels    []string `json:"labels,omitempty"`
	Assignees []string `json:"assignees,omitempty"`
	Reviewers []string `json:"reviewers,omitempty"`
	Draft     bool     `json:"draft,omitempty"`
}

type githubUpdatePRRequest struct {
	Title     string   `json:"title,omitempty"`
	Body      string   `json:"body,omitempty"`
	State     string   `json:"state,omitempty"`
	Base      string   `json:"base,omitempty"`
	Labels    []string `json:"labels,omitempty"`
	Assignees []string `json:"assignees,omitempty"`
}

type githubMergePRRequest struct {
	CommitTitle string `json:"commit_title,omitempty"`
	CommitMsg   string `json:"commit_message,omitempty"`
	MergeMethod string `json:"merge_method,omitempty"`
}

// GitHub webhook API types
type githubWebhookRequest struct {
	Name   string                `json:"name"`
	Active bool                  `json:"active"`
	Events []string              `json:"events"`
	Config githubWebhookConfig   `json:"config"`
}

type githubWebhookConfig struct {
	URL         string `json:"url"`
	ContentType string `json:"content_type"`
	Secret      string `json:"secret"`
}

type GitHubWebhookResponse struct {
	ID     int                 `json:"id"`
	Name   string              `json:"name"`
	Active bool                `json:"active"`
	Events []string            `json:"events"`
	Config githubWebhookConfig `json:"config"`
	URL    string              `json:"url"`
}

// CreatePullRequest creates a new pull request on GitHub
func (g *GitHubPullRequestProvider) CreatePullRequest(ctx context.Context, options PullRequestOptions) (*PullRequest, error) {
	reqBody := githubCreatePRRequest{
		Title:     options.Title,
		Body:      options.Description,
		Head:      options.HeadBranch,
		Base:      options.BaseBranch,
		Labels:    options.Labels,
		Assignees: options.Assignees,
		Reviewers: options.Reviewers,
		Draft:     options.Draft,
	}

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

	// Log PR creation with structured data
	g.logger.Info("Creating GitHub PR",
		slog.String("url", fmt.Sprintf("%s/repos/%s/%s/pulls", g.config.BaseURL, g.owner, g.repo)),
		slog.String("title", options.Title),
		slog.String("head_branch", options.HeadBranch),
		slog.String("base_branch", options.BaseBranch),
		slog.Any("labels", options.Labels))

	url := fmt.Sprintf("%s/repos/%s/%s/pulls", g.config.BaseURL, g.owner, g.repo)

	req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(jsonBody))
	if err != nil {
		return nil, fmt.Errorf("failed to create request: %w", err)
	}

	req.Header.Set("Authorization", "token "+g.config.Token)
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/vnd.github.v3+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 {
		// Read the error response body for detailed error information
		var errorBody bytes.Buffer
		_, _ = errorBody.ReadFrom(resp.Body)
		return nil, fmt.Errorf("GitHub API error: %d - %s", resp.StatusCode, errorBody.String())
	}

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

	return g.convertGitHubPR(githubPR), nil
}

// GetPullRequest retrieves a pull request by number
func (g *GitHubPullRequestProvider) GetPullRequest(ctx context.Context, id string) (*PullRequest, error) {
	url := fmt.Sprintf("%s/repos/%s/%s/pulls/%s", g.config.BaseURL, g.owner, g.repo, id)
	req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
	if err != nil {
		return nil, fmt.Errorf("failed to create request: %w", err)
	}

	req.Header.Set("Authorization", "token "+g.config.Token)
	req.Header.Set("Accept", "application/vnd.github.v3+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("GitHub API error: %d", resp.StatusCode)
	}

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

	return g.convertGitHubPR(githubPR), nil
}

// ListPullRequests lists pull requests
func (g *GitHubPullRequestProvider) ListPullRequests(ctx context.Context, options ListPullRequestOptions) ([]PullRequest, error) {
	url := fmt.Sprintf("%s/repos/%s/%s/pulls", g.config.BaseURL, g.owner, g.repo)
	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()
	if options.State != "" {
		q.Add("state", options.State)
	}
	if options.Author != "" {
		q.Add("author", options.Author)
	}
	if options.Assignee != "" {
		q.Add("assignee", options.Assignee)
	}
	if options.BaseBranch != "" {
		q.Add("base", options.BaseBranch)
	}
	if options.HeadBranch != "" {
		q.Add("head", options.HeadBranch)
	}
	if options.Limit > 0 {
		q.Add("per_page", fmt.Sprintf("%d", options.Limit))
	}
	req.URL.RawQuery = q.Encode()

	req.Header.Set("Authorization", "token "+g.config.Token)
	req.Header.Set("Accept", "application/vnd.github.v3+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("GitHub API error: %d", resp.StatusCode)
	}

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

	prs := make([]PullRequest, len(githubPRs))
	for i, githubPR := range githubPRs {
		prs[i] = *g.convertGitHubPR(githubPR)
	}

	return prs, nil
}

// UpdatePullRequest updates a pull request
func (g *GitHubPullRequestProvider) UpdatePullRequest(ctx context.Context, id string, options PullRequestOptions) (*PullRequest, error) {
	reqBody := githubUpdatePRRequest{
		Title:     options.Title,
		Body:      options.Description,
		Base:      options.BaseBranch,
		Labels:    options.Labels,
		Assignees: options.Assignees,
	}

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

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

	req.Header.Set("Authorization", "token "+g.config.Token)
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/vnd.github.v3+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("GitHub API error: %d", resp.StatusCode)
	}

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

	return g.convertGitHubPR(githubPR), nil
}

// ClosePullRequest closes a pull request
func (g *GitHubPullRequestProvider) ClosePullRequest(ctx context.Context, id string) error {
	reqBody := githubUpdatePRRequest{
		State: "closed",
	}

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

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

	req.Header.Set("Authorization", "token "+g.config.Token)
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/vnd.github.v3+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("GitHub API error: %d", resp.StatusCode)
	}

	return nil
}

// MergePullRequest merges a pull request
func (g *GitHubPullRequestProvider) MergePullRequest(ctx context.Context, id string, options MergePullRequestOptions) error {
	reqBody := githubMergePRRequest{
		CommitTitle: options.CommitTitle,
		CommitMsg:   options.CommitMsg,
		MergeMethod: options.MergeMethod,
	}

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

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

	req.Header.Set("Authorization", "token "+g.config.Token)
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/vnd.github.v3+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("GitHub API error: %d", resp.StatusCode)
	}

	return nil
}

// convertGitHubPR converts a GitHub pull request to our PullRequest type
func (g *GitHubPullRequestProvider) convertGitHubPR(githubPR githubPullRequest) *PullRequest {
	labels := make([]string, len(githubPR.Labels))
	for i, label := range githubPR.Labels {
		labels[i] = label.Name
	}

	assignees := make([]Author, len(githubPR.Assignees))
	for i, assignee := range githubPR.Assignees {
		assignees[i] = Author{
			Name:  assignee.Login,
			Email: "", // GitHub API doesn't provide email in this context
		}
	}

	reviewers := make([]Author, len(githubPR.RequestedReviewers))
	for i, reviewer := range githubPR.RequestedReviewers {
		reviewers[i] = Author{
			Name:  reviewer.Login,
			Email: "", // GitHub API doesn't provide email in this context
		}
	}

	return &PullRequest{
		ID:          fmt.Sprintf("%d", githubPR.ID),
		Number:      githubPR.Number,
		Title:       githubPR.Title,
		Description: githubPR.Body,
		State:       githubPR.State,
		Author: Author{
			Name:  githubPR.User.Login,
			Email: "", // GitHub API doesn't provide email in this context
		},
		CreatedAt:  githubPR.CreatedAt,
		UpdatedAt:  githubPR.UpdatedAt,
		BaseBranch: githubPR.Base.Ref,
		HeadBranch: githubPR.Head.Ref,
		BaseRepo:   githubPR.Base.Repo.FullName,
		HeadRepo:   githubPR.Head.Repo.FullName,
		Labels:     labels,
		Assignees:  assignees,
		Reviewers:  reviewers,
		Commits:    []Commit{},             // Would need additional API call to populate
		Comments:   []PullRequestComment{}, // Would need additional API call to populate
		URL:        fmt.Sprintf("https://github.com/%s/%s/pull/%d", g.owner, g.repo, githubPR.Number),
	}
}

// ListWebhooks lists existing webhooks for the repository
func (g *GitHubPullRequestProvider) ListWebhooks(ctx context.Context) ([]GitHubWebhookResponse, error) {
	url := fmt.Sprintf("%s/repos/%s/%s/hooks", g.config.BaseURL, g.owner, g.repo)
	req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
	if err != nil {
		return nil, fmt.Errorf("failed to create request: %w", err)
	}

	req.Header.Set("Authorization", "token "+g.config.Token)
	req.Header.Set("Accept", "application/vnd.github.v3+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 {
		var errorBody bytes.Buffer
		_, _ = errorBody.ReadFrom(resp.Body)
		return nil, fmt.Errorf("GitHub API error: %d - %s", resp.StatusCode, errorBody.String())
	}

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

	return webhooks, nil
}

// CreateWebhook creates a new webhook for the repository
func (g *GitHubPullRequestProvider) CreateWebhook(ctx context.Context, webhookURL, secret string) (*GitHubWebhookResponse, error) {
	reqBody := githubWebhookRequest{
		Name:   "web",
		Active: true,
		Events: []string{"pull_request"},
		Config: githubWebhookConfig{
			URL:         webhookURL,
			ContentType: "json",
			Secret:      secret,
		},
	}

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

	g.logger.Info("Creating GitHub webhook",
		slog.String("url", fmt.Sprintf("%s/repos/%s/%s/hooks", g.config.BaseURL, g.owner, g.repo)),
		slog.String("webhook_url", webhookURL),
		slog.Any("events", reqBody.Events))

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

	req.Header.Set("Authorization", "token "+g.config.Token)
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/vnd.github.v3+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 {
		var errorBody bytes.Buffer
		_, _ = errorBody.ReadFrom(resp.Body)
		return nil, fmt.Errorf("GitHub API error: %d - %s", resp.StatusCode, errorBody.String())
	}

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

	return &webhook, nil
}

// UpdateWebhook updates an existing webhook
func (g *GitHubPullRequestProvider) UpdateWebhook(ctx context.Context, webhookID int, webhookURL, secret string) (*GitHubWebhookResponse, error) {
	reqBody := githubWebhookRequest{
		Name:   "web",
		Active: true,
		Events: []string{"pull_request"},
		Config: githubWebhookConfig{
			URL:         webhookURL,
			ContentType: "json",
			Secret:      secret,
		},
	}

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

	g.logger.Info("Updating GitHub webhook",
		slog.Int("webhook_id", webhookID),
		slog.String("webhook_url", webhookURL),
		slog.Any("events", reqBody.Events))

	url := fmt.Sprintf("%s/repos/%s/%s/hooks/%d", g.config.BaseURL, g.owner, g.repo, webhookID)
	req, err := http.NewRequestWithContext(ctx, "PATCH", url, bytes.NewBuffer(jsonBody))
	if err != nil {
		return nil, fmt.Errorf("failed to create request: %w", err)
	}

	req.Header.Set("Authorization", "token "+g.config.Token)
	req.Header.Set("Content-Type", "application/json")
	req.Header.Set("Accept", "application/vnd.github.v3+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 {
		var errorBody bytes.Buffer
		_, _ = errorBody.ReadFrom(resp.Body)
		return nil, fmt.Errorf("GitHub API error: %d - %s", resp.StatusCode, errorBody.String())
	}

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

	return &webhook, nil
}
