use persistence_std::{
    shim::Any,
    types::{
        cosmos::gov::v1::{ProposalStatus, QueryProposalsRequest, QueryProposalsResponse},
        cosmwasm::wasm::v1::MsgExecuteContract,
    },
};
use prost::Message;

#[test]
pub fn json_deserialization_fix_test() {
    let json = r#"{"@type":"/cosmwasm.wasm.v1.MsgExecuteContract","sender":"persistence10d07y265gmmuvt4z0w9aw880jnsr700j5w4kch","contract":"persistence1xxx3ps3gm3wceg4g300hvggdv7ga0hmsk64srccffmfy4wvcrugq3skeny","msg":{"resume_create_pool":{"pool_creation_request_id":1}},"funds":[]}"#;

    let test: Any = serde_json_wasm::from_str(json).unwrap();

    // convert any back to msg execute contract
    let msg: MsgExecuteContract = MsgExecuteContract::try_from(test).unwrap();

    // get msg of msg to validate the json deserialization
    let str: String = String::from_utf8(msg.msg.clone()).unwrap();
    assert_eq!(
        str,
        r#"{"resume_create_pool":{"pool_creation_request_id":1}}"#
    );

    // str.as_bytes().to_vec();
}

#[test]
pub fn enum_serde_test() {
    let query = QueryProposalsRequest {
        proposal_status: ProposalStatus::DepositPeriod.into(),
        voter: "".to_string(),
        depositor: "".to_string(),
        pagination: None,
    };

    let json = serde_json_wasm::to_string(&query).unwrap();
    println!("{}", json);
    let query2: QueryProposalsRequest = serde_json_wasm::from_str(&json).unwrap();

    assert_eq!(query, query2);

    let test_json = r#"{"proposals":[{"id":"3","messages":[{"@type":"/cosmwasm.wasm.v1.MsgExecuteContract","sender":"persistence10d07y265gmmuvt4z0w9aw880jnsr700j5w4kch","contract":"persistence1xxx3ps3gm3wceg4g300hvggdv7ga0hmsk64srccffmfy4wvcrugq3skeny","msg":{"resume_create_pool":{"pool_creation_request_id":2}},"funds":[]}],"status":"PROPOSAL_STATUS_DEPOSIT_PERIOD","final_tally_result":{"yes_count":"0","abstain_count":"0","no_count":"0","no_with_veto_count":"0"},"submit_time":"2023-09-06T16:32:52.516964Z","deposit_end_time":"2023-09-08T16:32:52.516964Z","total_deposit":[],"voting_start_time":null,"voting_end_time":null,"metadata":"test","title":"Test Proposal","summary":"test","proposer":"persistence1xxx3ps3gm3wceg4g300hvggdv7ga0hmsk64srccffmfy4wvcrugq3skeny"}],"pagination":{"next_key":null,"total":"1"}}"#;
    let val: Result<QueryProposalsResponse, serde_json_wasm::de::Error> =
        serde_json_wasm::from_str(test_json);

    println!("{:?}", val);
}