package fadcli

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
)

type DeployBYOCRegionReq struct {
	TiDBCloudInstance string `json:"-"`
	Provider          string `json:"provider"`
	RegionName        string `json:"region_name"`
	LogicalRegionName string `json:"logical_region_name"`
	O11YRegionName    string `json:"o11y_region_name"`
	Trigger           string `json:"trigger"`
	MAccount          string `json:"m_account"`
	DAccounts         string `json:"d_accounts"`
	O11YAccount       string `json:"o11y_account"`
	TraceID           string `json:"trace_id"`
	AvailabilityZones string `json:"availability_zones"`
	RdsName           string `json:"rds_instance_name"`
	CreateRds         string `json:"create_rds"`
	AdvanceOptions    string `json:"advance_options"`
}

func (c *client) insertBYOCRegionCreateRequest(request *DeployBYOCRegionReq) error {
	endpoints := map[string]string{
		"prod":    "https://us-west-2.data.tidbcloud.com/api/v1beta/app/dataapp-WObJIvhw/endpoint/prod/nextgen/byoc_regions",
		"staging": "https://us-west-2.data.tidbcloud.com/api/v1beta/app/dataapp-WObJIvhw/endpoint/staging/nextgen/byoc_regions",
		"dev":     "https://us-west-2.data.tidbcloud.com/api/v1beta/app/dataapp-WObJIvhw/endpoint/dev/nextgen/byoc_regions",
	}
	endpoint := endpoints[request.TiDBCloudInstance]
	if endpoint == "" {
		return fmt.Errorf("unsupported environment: %s", request.TiDBCloudInstance)
	}

	body, err := json.Marshal(request)
	if err != nil {
		return err
	}
	req, err := http.NewRequest(http.MethodPost, endpoint, bytes.NewReader(body))
	if err != nil {
		return err
	}
	req.SetBasicAuth(c.DSPublicKey, c.DSPrivateKey)
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err
	}

	respContent, err := io.ReadAll(resp.Body)
	if err != nil {
		return err
	}

	var dsResp struct {
		Data struct {
			Result struct {
				Code    int    `json:"code"`
				Message string `json:"message"`
			} `json:"result"`
		} `json:"data"`
	}
	err = json.Unmarshal(respContent, &dsResp)
	if err != nil {
		return err
	}

	if dsResp.Data.Result.Code != 200 {
		return fmt.Errorf("data service returns non 200: code %d, message: %s", dsResp.Data.Result.Code, dsResp.Data.Result.Message)
	}
	return nil
}
