use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;

#[derive(PartialEq, Clone, Serialize, Deserialize, Debug)]
#[serde(tag = "type", content = "data")]
pub enum Fields {
    Named(Vec<(String, Typ)>),
    Unnamed(Vec<Typ>),
}

/**
named structs, unnamed structs and tuples
если нет названий полей в структуре, то это неименованная структура или кортеж.
*/
#[derive(PartialEq, Clone, Serialize, Deserialize, Debug)]
pub struct StructType {
    pub name: String,
    pub fields: Fields,
}

#[derive(PartialEq, Clone, Serialize, Deserialize, Debug)]
pub struct EnumType {
    pub name: String,
    pub variants: BTreeMap<u8, (String, Typ)>,
}

#[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug)]
pub struct SimpleEnumType {
    pub name: String,
    pub variants: BTreeMap<u8, String>,
}

#[derive(PartialEq, Clone, Serialize, Deserialize, Debug)]
#[serde(tag = "type", content = "data")]
pub enum Typ {
    Bool,
    U8,
    U16,
    U32,
    U64,
    I32,
    I64,
    F32,
    F64,
    Str,
    Datetime,
    ID,
    // массив байт
    Bytes,
    // массив байт фиксированного размера
    /// array bytes with bytes count in scheme
    ArrayBytes(u32),
    Array(u32, Box<Typ>),
    // Вектор или массив значений одного типа
    Vec(Box<Typ>),
    Optional(Box<Typ>),
    SimpleEnum(SimpleEnumType),
    Struct(StructType),
    Enum(EnumType),
    Void,
}
