package CJson.test

import std.convert.*
import std.time.DateTime

import CJson.*
import CJson.jsonmacro.*

class CustInt64Serializer <: IJsonValueSerializable<Int64> {
    public CustInt64Serializer(let value: Int64) {
    }

    public static func fromJsonValue(json: JsonValue): Int64 {
        return json.asInt().getValue() * 100
    }

    public func toJsonValue(): JsonValue {
        return JsonInt(this.value/100)
    }
}

class CustDateTimeSerializer <: IJsonValueSerializable<DateTime> {
    public CustDateTimeSerializer(let value: DateTime) {

    }

    public static func fromJsonValue(json: JsonValue): DateTime {
        let time = DateTime.parse(json.asString().getValue().trimLeft("\"").trimRight("\""))
        return time.addYears(-1)
    }

    public func toJsonValue(): JsonValue {
        return  JsonString(this.value.addYears(1).toString())
    }
}

@JsonSerializable
public class CustTest {
    @JsonCust[CustInt64Serializer]
    var count: Int64 = 99

    @JsonCust[CustDateTimeSerializer]
    var time: DateTime = DateTime.now()
}

@Test
public class TestCUst {
    private let CUSTTEST_JSON = "{\"count\":88,\"time\":\"2023-12-25T00:00:00+01:00\"}"
    @TestCase
    func testCustFromJson(): Unit {
        let cust = CustTest.fromJson(CUSTTEST_JSON)
        @Assert(cust.count, 8800)
        @Assert(cust.time.year, 2022)
    }

    @TestCase
    func testCustToJson(): Unit {
        @Assert(CustTest.fromJson(CUSTTEST_JSON).toJson(), CUSTTEST_JSON)
    }
}