use itertools::Itertools;
use yew::prelude::*;

mod classes;
mod constants;
mod container;
mod definition;
mod extends;
mod modules;
mod traits;
mod typing;

pub use crate::{
    items,
    items::{
        classes::Class,
        constants::{FlexCenterExpansion, IndentHtml, EMPTY_HTML},
        container::*,
        definition::{Function, Method, Parameter},
        extends::Extends,
        traits::{Trait, TraitBoundItem},
        typing::{build_generics, Typing},
    },
};
use std::{
    fmt::{self, Display, Formatter},
    rc::Rc,
};

pub fn example(input: &str) -> Html {
    let class = Class {
        name: String::from(input),
        path: "AA".to_string(),
        generic: vec![Typing::from("T"), Typing::from("U"), Typing::from("char")],
        traits: vec![],
    };
    let class_traits =
        RcList::from(
            &["Debug", "Display", "Debug", "Display", "Debug", "Display", "Debug", "Display", "Debug", "Display"] as &[_]
        );
    let e = Extends {
        id: 1,
        generic: RcList::from(&["T", "U", "V", "R", "u8"] as &[_]),
        version: String::new(),
        class: Rc::new(class),
        class_typing: RcList::from(&["X", "T", "Y", "char"] as &[_]),
        class_traits: class_traits.clone(),
        class_bounds: RcList(vec![
            Rc::new(TraitBoundItem { left: Typing::from("T"), right: Trait::from("Display") }),
            Rc::new(TraitBoundItem { left: Typing::from("U"), right: Trait::from("Debug") }),
        ]),
    };

    html! {
    <>
        {class_traits.build_table()}
        <SignatureComponent::<Extends> data = e/>
    </>
    }
}

pub fn example2(input: &str) -> Html {
    let class = Class {
        name: String::from(input),
        path: "AA".to_string(),
        generic: vec![Typing::from("T"), Typing::from("U"), Typing::from("char")],
        traits: vec![],
    };
    let e = Function {
        name: String::from(input),
        generic: vec![Typing::from("T"), Typing::from("V"), Typing::from("U")],
        version: String::new(),
        class: Rc::new(class),
        parameters: Parameter::Array(vec![
            Parameter::Zelf(Some(true)),
            Parameter::Zelf(Some(false)),
            Parameter::PositionOnly,
            Parameter::Zelf(None),
            Parameter::KeyValueOnly,
        ]),
    };
    html! {
        <SignatureComponent::<Function> data = e/>
    }
}