package swservice

import (
	"fmt"
	"testing"
)

const caPEM = `-----BEGIN CERTIFICATE-----
MIID8TCCAtmgAwIBAgIJAKFBiWb1ivtAMA0GCSqGSIb3DQEBCwUAMIGOMQswCQYD
VQQGEwJDTjELMAkGA1UECAwCU0gxETAPBgNVBAcMCFNoYW5naGFpMRIwEAYDVQQK
DAlTdXB3aXNkb20xDDAKBgNVBAsMA1lrdDEaMBgGA1UEAwwReWt0LnN1cHdpc2Rv
bS5jb20xITAfBgkqhkiG9w0BCQEWEnRlY2hAc3Vwd2lzZG9tLmNvbTAeFw0xNjA3
MTQwMjU4MTBaFw0xNjA4MTMwMjU4MTBaMIGOMQswCQYDVQQGEwJDTjELMAkGA1UE
CAwCU0gxETAPBgNVBAcMCFNoYW5naGFpMRIwEAYDVQQKDAlTdXB3aXNkb20xDDAK
BgNVBAsMA1lrdDEaMBgGA1UEAwwReWt0LnN1cHdpc2RvbS5jb20xITAfBgkqhkiG
9w0BCQEWEnRlY2hAc3Vwd2lzZG9tLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP
ADCCAQoCggEBANaI/Go+ysBu1pQytxyFKehHic+WCfWeFltnKJg6QczYczqqZR8K
xpRfEOWy3srRr5K+IRASuYka5DIHyZkozisdcLH8pzBd/gKluh0PlMClOJ8nYbe/
6LHuASPzaehLxenjg8G39A0qX3cJCo0Wo95fkzViroyMKX4wu91GYlOlMv/5PlbZ
dtL5G2yJPuvyyG8cp7OUQjVFdfI1S3rLnwn3DDCnhsw48j8GFTbdPWbnIqG2sgW0
K6ycTioTmvxEWjMEl+f1aodQ13FbtG84xcLOz0kcvAHzcLATKHXhs3f9jZMo62Y1
jDjq9kmPkznv35r/Wvh94dsBPjroH15sLXUCAwEAAaNQME4wHQYDVR0OBBYEFOXs
u68Yd29qPaSADyL9cq8T7aYOMB8GA1UdIwQYMBaAFOXsu68Yd29qPaSADyL9cq8T
7aYOMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBADkZxo5/r82rmwKz
A5Jba2YLWiBtjalHfpi2US8IQKva47Jb/P/TmbukdNCeaNjS8FRypaA4HM81G+tE
mDIIL5U8KnZ3DeZA/Ql4GtWscLxs92NdNo4dNqMZyLtphEQVY4mkynygqW4koCwN
fo6rwgTWN+kZ2Eo5i8ZPsCi2mew7vy8IK+B06toVw0picCgvhCXtVjHS4ndj52FZ
9nNHnIoaJLxPj+UhICKH73WVJdZQEPpfB7upkBARNJ7y313wm6wh8FIA86frqKiV
mggFtcm1X5BXnYYe9p+3+e5qQK2hkiZuRKzjAaIwzww5oI5QMHLkyDa1Mhn87w2v
9HSYpIA=
-----END CERTIFICATE-----

`
const (
	appID     = "100001"
	appSecret = "3072a87ece234b728b519ded8dd152b1"
	termID    = "1020303"
)

func TestUseHTTP(t *testing.T) {
	uri := "http://ykt.supwisdom.com:9116/epayapi/services"
	session := NewSession(appID, appSecret, termID, uri, 3, true)
	err := session.Auth()
	if err != nil {
		t.Errorf("Auth Error: %v", err)
	}

	r, err := session.CallService2("/common/servicecheck",
		make(map[string]interface{}), 3)
	if err != nil {
		t.Errorf("Request Error: %v", err)
	} else {
		fmt.Printf("hostdatetime: %v\n", r.GetStrValue("hostdatetime"))
	}

	r, err = session.CallService2("/v5/manage/pos/gettoken",
		map[string]interface{}{
			"devphyid": "30000004",
		}, 3, "devphyid")

	if err != nil {
		t.Errorf("Request Error: %v", err)
	} else if r.GetIntValue("retcode") != 0 {
		t.Errorf("get device token error, ret=%v", r.GetIntValue("retcode"))
	} else {
		fmt.Printf("ret=%v, devtoken: %v\n", r.GetIntValue("retcode"),
			r.GetStrValue("devtoken"))
	}
}

func TestUseHTTPS(t *testing.T) {
	uri := "https://ykt.supwisdom.com/epayapi/services"
	session, err := NewSessionWithCA(appID, appSecret, termID, uri, 3, []byte(caPEM))
	if err != nil {
		t.Error("New Session , ", err)
		return
	}
	err = session.Auth()
	if err != nil {
		t.Errorf("Auth Error: %v", err)
		return
	}
}

func TestUseSecureHTTPS(t *testing.T) {
	uri := "https://ykt.supwisdom.com/epayapi/services"
	session := NewSession(appID, appSecret, termID, uri, 3, true)
	err := session.Auth()
	if err != nil {
		t.Errorf("Auth Error: %v", err)
		return
	}
}
