package backend

import (
	"bytes"
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"regexp"

	"github.com/google/uuid"
)

func ConvertToMarkdown(c *Config, filename string) ([]byte, error) {
	var stderr bytes.Buffer

	tmpDir, err := os.MkdirTemp(os.TempDir(), "cpolis_images")
	if err != nil {
		return nil, fmt.Errorf("error creating temporary directory: %v", err)
	}
	defer os.RemoveAll(tmpDir)

	articleFileName := filepath.Join(os.TempDir(), fmt.Sprint(uuid.New(), ".md"))
	cmd := exec.Command("pandoc", "-s", "-f", "docx", "-t", "commonmark_x", "-o", articleFileName, "--extract-media", tmpDir, filename) // TODO: Is writing to a file necessary?
	cmd.Stderr = &stderr
	if err = cmd.Run(); err != nil {
		return nil, fmt.Errorf("error converting docx to markdown: %v: %v", err, stderr.String())
	}
	defer os.Remove(articleFileName)

	articleContent, err := os.ReadFile(articleFileName)
	if err != nil {
		return nil, fmt.Errorf("error reading markdown file: %v", err)
	}

	imageNames, err := filepath.Glob(filepath.Join(tmpDir, "media", "*"))
	if err != nil {
		return nil, fmt.Errorf("error getting docx images from temporary directory: %v", err)
	}

	for _, name := range imageNames {
		image, err := os.Open(name)
		if err != nil {
			return nil, fmt.Errorf("error opening image file %v: %v", name, err)
		}
		defer image.Close()

		newImageName, err := SaveImage(image, c.MaxImgHeight, c.MaxImgWidth, c.ImgDir)
		if err != nil {
			return nil, fmt.Errorf("error saving image %v: %v", name, err)
		}

		articleContent = regexp.MustCompile(name).ReplaceAll(articleContent, []byte(c.Domain+"/image/serve/"+newImageName))
	}

	return articleContent, nil
}