use styrust::*;

// 1. 参照を持つ構造体にはライフタイム <'a> をつけます
struct Hover<'a>{
    id: &'a str,
    color: [u8;3],
    bg_color: [u8;3],
    font_size: f32,
    width: f32,
    height: f32,  
    padding: f32,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let hover = Hover {
        id: ".btn", // &".btn" ではなく ".btn" だけで &str になります
        color: [200, 255, 255], // 2. オーバーフローを防ぐため 255 以下に修正
        bg_color: [100, 100, 100],
        font_size: 11.0,
        width: 200.0,
        height: 100.0,
        padding: 10.0,
    };

    // 3. matchではなく ? 演算子を使うと、Errの処理を簡潔に書けます
    let style = hover_style(hover)?;
    
    // 生成されたスタイルを使う(例: 出力)
    println!("{}", style);

    // 4. 関数定義に合わせて Ok(()) を返す
    Ok(())
}

// 5. 戻り値を &str から String に変更します
fn hover_style(p: Hover) -> Result<String, Box<dyn std::error::Error>>  {
    // 1. ここで id を単独の変数 `selector` に切り出します(&str 型になります)
    let selector = p.id; 
    let color = Color::rgb(p.color[0], p.color[1], p.color[2]);
    let bg_color = BackgroundColor::rgb(p.bg_color[0], p.bg_color[1], p.bg_color[2]);
    let font_size = FontSize::px(p.font_size)?;
    let width = Width::px(p.width)?;
    let height = Height::px(p.height)?;
    let padding = Padding::px(p.padding)?;

    let style = css_style!{
        // 2. $p.id ではなく、単一変数の $selector を使います
        selector!(unsafe{$selector}{
            text!(color(color),size(font_size),);
            bg!(w(width),h(height),p(padding),color(bg_color));
        });
    };

    Ok(style)
}