/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package hessian

import (
	"testing"
	"time"
)

import (
	"github.com/stretchr/testify/assert"
)

func init() {
	RegisterPOJO(&DateDemo{})
}

type DateDemo struct {
	Name    string
	Date    time.Time
	Dates   []**time.Time
	NilDate *time.Time
	Date1   *time.Time
	Date2   **time.Time
	Date3   ***time.Time
}

//JavaClassName  java fully qualified path
func (DateDemo) JavaClassName() string {
	return "test.model.DateDemo"
}

func TestEncDate(t *testing.T) {
	var (
		v   string
		tz  time.Time
		err error
		e   *Encoder
		d   *Decoder
		res interface{}
	)

	e = NewEncoder()
	v = "2014-02-09 06:15:23"
	tz, _ = time.Parse("2006-01-02 15:04:05", v)
	e.Encode(tz)
	if len(e.Buffer()) == 0 {
		t.Fail()
	}

	d = NewDecoder(e.Buffer())
	res, err = d.Decode()
	t.Logf("decode(%s, %s) = %v, %v\n", v, tz.Local(), res, err)
}

func testDateFramework(t *testing.T, method string, expected time.Time) {
	r, e := decodeJavaResponse(method, "", false)
	if e != nil {
		t.Errorf("%s: decode fail with error %+v", method, e)
		return
	}

	v, ok := r.(time.Time)
	if !ok {
		t.Errorf("%s: %v is not date", method, r)
		return
	}

	if !v.Equal(expected) {
		t.Errorf("%s: got %v, wanted %v", method, v, expected)
	}
}

func TestDate(t *testing.T) {
	testDateFramework(t, "replyDate_0", time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC))
	testDateFramework(t, "replyDate_1", time.Date(1998, 5, 8, 9, 51, 31, 0, time.UTC))
	testDateFramework(t, "replyDate_2", time.Date(1998, 5, 8, 9, 51, 0, 0, time.UTC))
}

func TestDateEncode(t *testing.T) {
	testJavaDecode(t, "argDate_0", time.Date(1970, 1, 1, 0, 0, 0, 0, time.UTC))
	testJavaDecode(t, "argDate_1", time.Date(1998, 5, 8, 9, 51, 31, 0, time.UTC))
	testJavaDecode(t, "argDate_2", time.Date(1998, 5, 8, 9, 51, 0, 0, time.UTC))
}

func TestEncDateNull(t *testing.T) {
	var (
		v   string
		tz  time.Time
		e   *Encoder
		d   *Decoder
		res interface{}
	)
	v = "2014-02-09 06:15:23 +0800 CST"
	tz, _ = time.Parse("2006-01-02 15:04:05 +0800 CST", v)
	d1 := &tz
	d2 := &d1
	d3 := &d2

	date := DateDemo{
		Name:    "zs",
		Date:    ZeroDate,
		Dates:   []**time.Time{d2, d2},
		NilDate: nil,
		Date1:   nil,
		Date2:   d2,
		Date3:   d3,
	}
	e = NewEncoder()
	e.Encode(date)
	if len(e.Buffer()) == 0 {
		t.Fail()
	}
	d = NewDecoder(e.Buffer())
	res, _ = d.Decode()
	assert.Equal(t, ZeroDate, res.(*DateDemo).Date)
	assert.Equal(t, 2, len(res.(*DateDemo).Dates))
	assert.Equal(t, tz.Local().String(), (*res.(*DateDemo).Dates[0]).String())
	assert.Equal(t, &ZeroDate, res.(*DateDemo).NilDate)
	assert.Equal(t, ZeroDate, *res.(*DateDemo).Date1)
	assert.Equal(t, tz.Local().String(), (*res.(*DateDemo).Date2).String())
	assert.Equal(t, tz.Local().String(), (*(*res.(*DateDemo).Date3)).String())

}

func TestDateNulJavaDecode(t *testing.T) {
	date := DateDemo{
		Name: "zs",
		Date: ZeroDate,
	}
	testJavaDecode(t, "customArgTypedFixed_DateNull", date)
}

func TestDateNilDecode(t *testing.T) {

	doTestDateNull(t, "customReplyTypedFixedDateNull")
}

func doTestDateNull(t *testing.T, method string) {
	testDecodeFrameworkFunc(t, method, func(r interface{}) {
		t.Logf("%#v", r)
		assert.Equal(t, ZeroDate, r.(*DateDemo).Date)
		assert.Equal(t, &ZeroDate, r.(*DateDemo).Date1)
	})
}
