package deploy

import (
	"encoding/base64"
	"os"
	"path/filepath"
	"strings"

	"github.com/nbd-wtf/go-nostr"
	"github.com/studiokaiji/nostr-webhost/hostr/cmd/tools"
)

// 有効なText Fileの拡張子
var availableTextFileSuffixes = []string{
	".txt",
	".csv",
	".pdf",
	".json",
	".yml",
	".yaml",
	".svg",
}

// [Text Fileの拡張子]: Content-Typeで記録する
var availableTextFileContentTypes = map[string]string{
	".txt":  "text/plain",
	".csv":  "text/csv",
	".pdf":  "application/pdf",
	".json": "application/json",
	".yml":  "application/x-yaml",
	".yaml": "application/x-yaml",
	".svg":  "image/svg+xml",
}

// [元パス]:[event]の形で記録する
var textFilePathToEvent = map[string]*nostr.Event{}

// basePath以下のText Fileのパスを全て羅列する
func listAllValidStaticTextFiles(basePath string) ([]string, error) {
	return tools.FindFilesWithBasePathBySuffixes(basePath, availableTextFileSuffixes)
}

// Text fileをBase pathから割り出して、eventを生成しキューに追加
func generateEventsAndAddQueueAllValidStaticTextFiles(priKey, pubKey, indexHtmlIdentifier, basePath string, replaceable bool) error {
	filePaths, err := listAllValidStaticTextFiles(basePath)
	if err != nil {
		return err
	}

	for _, filePath := range filePaths {
		// ファイルを開く
		bytesContent, err := os.ReadFile(filePath)
		if err != nil {
			return err
		}

		// ファイル内容をbase64エンコード
		content := base64.StdEncoding.EncodeToString(bytesContent)

		tags := nostr.Tags{}
		// 置き換え可能なイベントの場合
		if replaceable {
			// filePathからbasePathを取り除く
			pathForIdentifier := strings.Replace(filePath, basePath, "", 1)
			// 識別子を取得
			fileIdentifier := getReplaceableIdentifier(indexHtmlIdentifier, pathForIdentifier)

			tags = tags.AppendUnique(nostr.Tag{"d", fileIdentifier})
		}

		// 拡張子からContent-Typeを取得
		contentType := availableTextFileContentTypes[filepath.Ext(filePath)]
		tags = tags.AppendUnique(nostr.Tag{"type", contentType})

		// kindを設定
		var kind int
		if replaceable {
			kind = 30064
		} else {
			kind = 1064
		}

		// eventを取得
		event, err := getEvent(priKey, pubKey, content, kind, tags)
		if err != nil {
			return err
		}

		textFilePathToEvent[filePath] = event

		addNostrEventQueue(event, filePath)
	}

	return nil
}
