termicat 0.2.1

A fun ASCII cat art display that shows random cats every 15-35 seconds
use rand::Rng;
use terminal_size::{terminal_size, Width, Height};

fn scale_ascii_art(art: &str) -> String {
    let lines: Vec<&str> = art.lines().collect();

    if lines.is_empty() {
        return art.to_string();
    }

    let size = terminal_size();
    if size.is_none() {
        return art.to_string();
    }

    let (Width(term_width), Height(term_height)) = size.unwrap();

    let art_height = lines.len();
    let art_width = lines.iter().map(|line| line.len()).max().unwrap_or(0);

    if art_width == 0 || art_height == 0 {
        return art.to_string();
    }

    let width_scale = (term_width as f32 * 0.9) / art_width as f32;
    let height_scale = (term_height as f32 * 0.9) / art_height as f32;

    let scale = width_scale.min(height_scale).min(16.0);

    if scale >= 0.95 && scale <= 1.05 {
        return art.to_string();
    }

    let mut scaled_lines = Vec::new();

    if scale < 1.0 {
        let step = 1.0 / scale;
        let mut y = 0.0;
        while y < art_height as f32 {
            let line_idx = y as usize;
            if line_idx < lines.len() {
                let line = lines[line_idx];
                let mut scaled_line = String::new();
                let mut x = 0.0;
                while x < line.len() as f32 {
                    let char_idx = x as usize;
                    if char_idx < line.len() {
                        scaled_line.push(line.chars().nth(char_idx).unwrap_or(' '));
                    }
                    x += step;
                }
                scaled_lines.push(scaled_line);
            }
            y += step;
        }
    } else {
        let repeat_count = scale as usize;
        for line in lines {
            let mut scaled_line = String::new();
            for ch in line.chars() {
                for _ in 0..repeat_count {
                    scaled_line.push(ch);
                }
            }
            for _ in 0..repeat_count {
                scaled_lines.push(scaled_line.clone());
            }
        }
    }

    scaled_lines.join("\n")
}

pub fn print_random_cat() {
    let cat = match rand::rng().random_range(0..=17) {
        0 => r#"
            |\__/,|   (`\
          _.|o o  |_   ) )
        -(((---(((--------
            "#,
        1 => r#"
            _._     _,-'""`-._
           (,-.`._,'(       |\`-/|
               `-.-' \ )-`( , o o)
                     `-    \`_`"'-
            "#,
        2 => r#"
            |\__/,|   (`\
            |_ _  |.--.) )
            ( T   )     /
           (((^_(((/(((_/
            "#,
        3 => r#"
            ("`-''-/").___..--''"`-._
             `6_ 6  )   `-.  (     ).`-.__.`)
             (_Y_.)'  ._   )  `._ `. ``-..-'
               _..`--'_..-_/  /--'_.'
              ((((.-''  ((((.'  (((.-'

            "#,
        4 => r#"
            __..--''``---....___   _..._    __
            /// //_.-'    .-/";  `        ``<._  ``.''_ `. / // /
            ///_.-' _..--.'_    \                    `( ) ) // //
            / (_..-' // (< _     ;_..__               ; `' / ///
            / // // //  `-._,_)' // / ``--...____..-' /// / //

            "#,
        5 => r#"
                    |\__/,|   (`\
                    |o o  |__ _)
                  _.( T   )  `  /
                ((_ `^--' /_<  \
                `` `-'(((/  (((/

            "#,
        6 => r#"
            *     ,MMM8&&&.            *
                 MMMM88&&&&&    .
                MMMM88&&&&&&&
    *           MMM88&&&&&&&&
                MMM88&&&&&&&&
                'MMM88&&&&&&'
                  'MMM8&&&'      *
         |\___/|
         )     (             .              '
        =\     /=
          )===(       *
         /     \
         |     |
        /       \
        \       /
 _/\_/\_/\__  _/_/\_/\_/\_/\_/\_/\_/\_/\_/\_
 |  |  |  |( (  |  |  |  |  |  |  |  |  |  |
 |  |  |  | ) ) |  |  |  |  |  |  |  |  |  |
 |  |  |  |(_(  |  |  |  |  |  |  |  |  |  |
 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 jgs|  |  |  |  |  |  |  |  |  |  |  |  |  |
            "#,
        7 => r#"
            *     ,MMM8&&&.            *
                 MMMM88&&&&&    .
                MMMM88&&&&&&&
    *           MMM88&&&&&&&&
                MMM88&&&&&&&&
                'MMM88&&&&&&'
                  'MMM8&&&'      *    _
         |\___/|                      \\
        =) ^Y^ (=   |\_/|              ||    '
         \  ^  /    )a a '._.-""""-.  //
          )=*=(    =\T_= /    ~  ~  \//
         /     \     `"`\   ~   / ~  /
         |     |         |~   \ |  ~/
        /| | | |\         \  ~/- \ ~\
        \| | |_|/|        || |  // /`
 jgs_/\_//_// __//\_/\_/\_((_|\((_//\_/\_/\_
 |  |  |  | \_) |  |  |  |  |  |  |  |  |  |
 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
            "#,
        8 => r#"
            (`.
             ) )
            ( (
             \ \
              \ \
            .-'  `-.
           /        `.
          (      )    `-._ ,    _
           )   ,'         (.\--'(
           \  (         ) /      \
            \  \_(     / (    <6 (6
             \_)))\   (   `._  .:Y)__
              '''  \   `-._.'`---^_)))
                    `-._ )))       ```
                         ```           hjw

            "#,
        9 => r#"

            *                  *
                __                *
             ,db'    *     *
            ,d8/       *        *    *
            888
            `db\       *     *
              `o`_                    **
         *               *   *    _      *
               *                 / )
            *    (\__/) *       ( (  *
          ,-.,-.,)    (.,-.,-.,-.) ).,-.,-.
         | @|  ={{      }}= | @|  / / | @|o |
        _j__j__j_)     `-------/ /__j__j__j_
        ________(               /___________
         |  | @| \              || o|O | @|
         |o |  |,'\\       ,   ,'"|  |  |  |  hjw
        vV\\|/vV|`-'\\  ,---\\   | \\Vv\\hjwVv\\//v
                   _) )    `. \ /
                  (__/       ) )
                            (_/



            "#,
        10 => r#"


            /\____/\    __
          .'  """"  `,-'  `--.__
     __,- :   -  -  ;  " ::     `-. -.__
  ,-sssss `._  `' _,'"     ,'~~~::`.sssss-.
 |ssssss ,' ,_`--'_    __,' ::  `  `.ssssss|
|sssssss `-._____~ `,,'_______,---_;; ssssss|
 |ssssssssss     `--'~{{__   ____   ,'ssssss|
  `-ssssssssssssssssss ~~~~~~~~~~~~ ssss.-'
       `---.sssssssssssssssssssss.---' Susie Oviatt


            "#,
        11 => r#"
            /\     /\
           {{  `---'  }}
           {{  O   O  }}
           ~~>  V  <~~__
             /     \    \_
            {{       }}\\  )_\\
            |  \_/  ) / /
             \__/  /(_/ /
               (__/
            "#,
        12 => r#"
            ,.     ,.
           {{^ \\-"-/ ^}}
           "   """   "
          {{ <O> _ <O> }}
          ==_ .:Y:. _==
        .""  `--^--' "".
       (,~-~."" "" ,~-~.)
 ------(     )----(     )-----
       ^-'-'-^    ^-'-'-^
 _____________________________
       |"""" /~.^.~\ """"|
 hjw    ,i-i-i(""(  i-i-i.
 `97   (o o o ))"")( o o o)
        \\(_) /(""(  \\ (_)/
        `--'  \\""\\  `--'
                )"")
               (""/
            "#,
        13 => r#"

            _             _
           | '-.       .-' |
            \'-.'-"""-'.-'/    _
             |= _:'.':_ =|    /:`)
             \\ <6>   <6> /   /  /
             |=   |_|   =|   |:'\\
             >\\:.  "  .:/<    ) .|
              /'-._^_.-'\    /.:/
             /::.     .::\  /' /
           .| '::.  .::'  |;.:/
          /`\:.         .:/`\(
         |:. | ':.   .:' | .:|
         | ` |:.;     ;.:| ` |
          \:.|  |:. .:|  |.:/
           \ |:.|     |.:| /
     jgs   /'|  |\   /|  |`\
          (,,/:.|.-'-.|.:\,,)
            (,,,/     \,,,)
            "#,
        14 => r#"
            .-o=o-.
        ,  /=o=o=o=\ .--.
       _|\|=o=O=o=O=|    \
   __.'  a`\=o=o=o=(`\   /
   '.   a 4/`|.-""'`\ \ ;'`)   .---.
     \   .'  /   .--'  |_.'   / .-._)
      `)  _.'   /     /`-.__.' /
   jgs `'-.____;     /'-.___.-'
                `"""`
            "#,
        15 => r#"

            .-.   _                __
           `  )`'-,`\        .-''``.-'
_.-''-.      _.'       `'--._.' ,-'  /
`\    _`'--'`                      .'
  '._ _`-       .--.   .--.      (`
     `.'       /    '.'    \      '.
    .'         \  0  |  0  /        '.
   /   _        '._.---._.'      _    \
   /    `'-.      (     )    .-'`     \
   / .---'_.   .   `-,-`  .  ._'---.  \
   |   -'`   .       |      .  `'-    |
   /_       .   '   /;\  '    .     ,_\
     >'-.     '-..-`( ' )`-..-'     /
    '._         '-'         _.'
    jgs    '-..,__       __,..-'
                  `'---'`

"#,
        16 => r#"

              \\
               .-'```^```'-.
               /   (\ __ /)  \
               |    ` \/ ` |\_/|
               \    \____/ (^Y^)--.-,
                `'-.......-'w-w__((__)  ldb))''))''

        "#,

        17 => r#"
                        ,     ,
                        |\,.,/|
                        ( @ @ )
                         \_Y_/
                     .___/___\________.
                     |  | | | |       |
                     |~~~~~~~~~~~~~~~~|
                     | <'_:<  <'_:<   |
                     :................:   ldb'')





        "#,
        _ => r#" uh oh something's wrong, this shouldn't happen!

            "#,
    };

    println!("{}", scale_ascii_art(cat));
}