package deployer

import (
	"certimate/internal/domain"
	"context"
	"encoding/json"
	"fmt"

	"github.com/aliyun/aliyun-oss-go-sdk/oss"
)

type aliyun struct {
	client *oss.Client
	option *DeployerOption
	infos  []string
}

func NewAliyun(option *DeployerOption) (Deployer, error) {
	access := &domain.AliyunAccess{}
	json.Unmarshal([]byte(option.Access), access)
	a := &aliyun{
		option: option,
		infos:  make([]string, 0),
	}
	client, err := a.createClient(access.AccessKeyId, access.AccessKeySecret)
	if err != nil {
		return nil, err
	}
	a.client = client
	return a, nil

}

func (a *aliyun) GetID() string {
	return fmt.Sprintf("%s-%s", a.option.AceessRecord.GetString("name"), a.option.AceessRecord.Id)
}

func (a *aliyun) GetInfo() []string {
	return a.infos
}

func (a *aliyun) Deploy(ctx context.Context) error {
	err := a.client.PutBucketCnameWithCertificate(getDeployString(a.option.DeployConfig, "bucket"), oss.PutBucketCname{
		Cname: getDeployString(a.option.DeployConfig, "domain"),
		CertificateConfiguration: &oss.CertificateConfiguration{
			Certificate: a.option.Certificate.Certificate,
			PrivateKey:  a.option.Certificate.PrivateKey,
			Force:       true,
		},
	})

	if err != nil {
		return fmt.Errorf("deploy aliyun oss error: %w", err)
	}

	return nil

}

func (a *aliyun) createClient(accessKeyId, accessKeySecret string) (*oss.Client, error) {
	client, err := oss.New(
		getDeployString(a.option.DeployConfig, "endpoint"),
		accessKeyId,
		accessKeySecret,
	)
	if err != nil {
		return nil, fmt.Errorf("create aliyun client error: %w", err)
	}
	return client, nil
}