package maker

import (
    "context"
    "os"
    "path/filepath"

    "gitea.loveuer.com/yizhisec/pkg3/logger"
    "yizhisec.com/hsv2/forge/internal/opt"
    "yizhisec.com/hsv2/forge/pkg/downloader"
    "yizhisec.com/hsv2/forge/pkg/resource"
)

type YosguardOpt func(*yosguardOpt)

type yosguardOpt struct{}

func (m *maker) Yosguard(ctx context.Context, opts ...YosguardOpt) error {
    const (
        configTemplate = `
Web:
  # default listen in docker0
  Host: 172.17.0.1
  Port: 7788

UUIDFilePath: /etc/yosguard/uuid

# 心跳间隔: 单位秒,默认为5
HeartbeatDuration: 5

# 控制器 yosguard 地址
ControllerServer:
  Host: dasheng.zhsftech.debug
  Port: 443

# True: 作为控制器运行; False: 不作为控制器运行
AsController: true

# True: 作为网关运行; False: 不作为网关运行
AsGateway: false

Database:
  SQLite:
    DBPath: "/etc/yosguard/db/yosguard.db"
    SQLPath: "/etc/yosguard/db/create.sql"`

        systemdService = `
[Unit]
Description=YiZhiSec YOSGuard
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/yosguard web --host __host__
StandardOutput=journal
StandardError=journal
Nice=-20
Restart=always
RestartSec=15

[Install]
WantedBy=multi-user.target`
        binURL = "https://artifactory.yizhisec.com:443/artifactory/filestore/hsv2/bin/yosguard"
    )

    location := filepath.Join(opt.Cfg.Make.Dir, "dependency", "yosguard")

    logger.Info("☑️ MakeYosguard: 开始构建 yosguard...")

    if err := os.MkdirAll(location, 0755); err != nil {
        logger.Debug("❌ MakeYosguard: 创建 yosguard 目录失败: %v", err)
        return err
    }

    if err := downloader.Download(
        ctx,
        binURL,
        filepath.Join(location, "yosguard"),
        downloader.WithInsecureSkipVerify(),
        downloader.WithFileMode(0755),
    ); err != nil {
        logger.Debug("❌ MakeYosguard: 下载 yosguard 失败: %v", err)
        return err
    }

    if err := os.WriteFile(filepath.Join(location, "config_template.yml"), []byte(configTemplate), 0644); err != nil {
        logger.Debug("❌ MakeYosguard: 生成 config_template.yml 失败: %v", err)
        return err
    }

    if err := os.WriteFile(filepath.Join(location, "create.sql"), resource.SQLYosguard, 0644); err != nil {
        logger.Debug("❌ MakeYosguard: 生成 create.sql 失败: %v", err)
        return err
    }

    if err := os.WriteFile(filepath.Join(location, "yosguard.service"), []byte(systemdService), 0644); err != nil {
        logger.Debug("❌ MakeYosguard: 生成 yosguard.service 失败: %v", err)
        return err
    }

    logger.Info("✅ MakeYosguard: 构建 yosguard成功!!!")
    return nil
}
