package main

import (
	"encoding/json"

	"github.com/juju/errors"
	"github.com/ngaut/log"
	"github.com/pingcap/schrodinger/pkg/test_client"
)

var (
	serverIP          = "http://pingcap-dev.hk.ufileos.com/schrodinger/painc_check"
	schrodingerLogURL = "http://schrodinger.pingcap.net/mortem/log"
	sqlCheckSet       = []SQLCheckFile{
		{URL: serverIP + "/5.7.7.sql.tar.gz", FileName: "5.7.7.sql"},
		{URL: serverIP + "/main-ms-ps-md.sql.tar.xz", FileName: "main-ms-ps-md.sql"},
		{URL: serverIP + "/main-new.sql.tar.gz", FileName: "main-new.sql"},
		{URL: serverIP + "/main.sql.tar.gz", FileName: "main.sql"},
		{URL: serverIP + "/encryption_and_vault.sql.tar.gz", FileName: "encryption_and_vault.sql"},
		{URL: serverIP + "/main-merged.sql.tar.gz", FileName: "main-merged.sql"},
		{URL: serverIP + "/main-pmm.sql.tar.gz", FileName: "main-pmm.sql"},
		{URL: serverIP + "/main-RTD.sql.tar.gz", FileName: "main-RTD.sql"},
		{URL: serverIP + "/main-tokudb.sql.tar.gz", FileName: "main-tokudb.sql"},
	}
	panicReportedURL = "http://pingcap-dev.hk.ufileos.com/schrodinger/panic_check/panicreported.txt"
	leagel           = make(map[string]*PanicStack, 0)
)

// SQLCheckFile contains what check set should use
type SQLCheckFile struct {
	URL      string
	FileName string
}

// uploadPos uploads pose
func uploadPos(cli *client.Client, pos *Pos) error {
	data, err := json.Marshal(pos)
	if err != nil {
		return errors.Trace(err)
	}
	err = cli.UploadPayloadUsingBoxID(data, "pos")
	if err != nil {
		return errors.Trace(err)
	}

	return nil
}

func getPos(cli *client.Client) (*Pos, error) {
	payload, err := cli.GetPayloadUsingBoxID("pos")
	if err != nil {
		return nil, errors.Trace(err)
	}
	pos := &Pos{}
	err = json.Unmarshal(payload, pos)
	if err != nil {
		return nil, errors.Trace(err)
	}

	log.Debugf("panic pos %+v", pos)
	return pos, nil
}

func getOrInitPos(cli *client.Client) (*Pos, error) {
	p, err := getPos(cli)
	if err == nil {
		return p, nil
	}
	p = &Pos{}
	if err := uploadPos(cli, p); err != nil {
		return p, errors.Trace(err)
	}

	return p, nil
}
