package web

import (
	"fmt"
	"html/template"
	"net/http"

	"charm.land/log/v2"
	"github.com/charmbracelet/soft-serve/pkg/backend"
	"github.com/charmbracelet/soft-serve/pkg/config"
	"github.com/charmbracelet/soft-serve/pkg/proto"
	"github.com/charmbracelet/soft-serve/pkg/ui/common"
)

// OverviewData contains data for rendering repository overview page.
type OverviewData struct {
	RepoBaseData
	IsEmpty    bool
	SSHURL     string
	HTTPURL    string
	ReadmeHTML template.HTML
}

// repoOverview handles repository overview page.
func repoOverview(w http.ResponseWriter, r *http.Request) {
	ctx := r.Context()
	logger := log.FromContext(ctx)
	repo := proto.RepositoryFromContext(ctx)
	cfg := config.FromContext(ctx)

	gr, err := openRepository(repo)
	if err != nil {
		logger.Debug("failed to open repository", "repo", repo.Name(), "err", err)
		renderInternalServerError(w, r)
		return
	}

	defaultBranch := getDefaultBranch(gr)
	isEmpty := defaultBranch == ""

	sshURL := common.RepoURL(cfg.SSH.PublicURL, repo.Name())
	httpURL := fmt.Sprintf("%s/%s.git", cfg.HTTP.PublicURL, repo.Name())

	var readmeHTML template.HTML
	if !isEmpty {
		head, _ := gr.HEAD()
		readmeContent, readmePath, err := backend.Readme(repo, head)
		if err == nil && readmeContent != "" {
			ctx := &ReadmeContext{
				RepoName:   repo.Name(),
				CommitHash: head.Reference.ID,
				ReadmePath: readmePath,
			}
			var mdErr error
			readmeHTML, mdErr = renderMarkdown([]byte(readmeContent), ctx)
			if mdErr != nil {
				logger.Debug("failed to render readme markdown", "repo", repo.Name(), "path", readmePath, "err", mdErr)
			}
		}
	}

	repoDisplayName := repo.ProjectName()
	if repoDisplayName == "" {
		repoDisplayName = repo.Name()
	}

	data := OverviewData{
		RepoBaseData: RepoBaseData{
			BaseData: BaseData{
				ServerName:  cfg.Name,
				ActiveTab:   "overview",
				Title:       repoDisplayName,
				Description: repo.Description(),
			},
			Repo:          repo,
			DefaultBranch: defaultBranch,
			HasGitBug:     hasGitBug(ctx, repo),
		},
		IsEmpty:    isEmpty,
		SSHURL:     sshURL,
		HTTPURL:    httpURL,
		ReadmeHTML: readmeHTML,
	}

	renderHTML(w, "overview.html", data)
}
