use simplegen::CodeBuffer;

pub fn template_for_header(mut filename: String) -> CodeBuffer {
    let mut buffer = CodeBuffer::new(4);

    // Removing extension from filename
    for _ in 0..2 {
        filename.pop();
    }

    buffer.println(format!("#ifndef _{}_H_", filename.to_uppercase()).as_str());
    buffer.println(format!("#define _{}_H_", filename.to_uppercase()).as_str());
    buffer.println("");
    buffer.println(format!("typedef struct _{}_t", filename.to_lowercase()).as_str());
    buffer.println("{");
    buffer.println("");
    buffer.println(format!("}} {}_t;", filename.to_lowercase()).as_str());
    buffer.println("");
    buffer.println("#endif");

    return buffer;
}

pub fn template_for_implementation(mut hfile_name: String) -> CodeBuffer {
    let mut buffer = CodeBuffer::new(4);

    for _ in 0..1 {
        hfile_name.pop();
    }

    buffer.println(format!("#include \"{}h\"", hfile_name.to_lowercase()).as_str());

    return buffer;
}

pub fn template_for_main(path_to_hfile: String) -> CodeBuffer {
    let mut buffer = CodeBuffer::new(4);

    buffer.println("#include <stdio.h>");
    buffer.println("#include <stdlib.h>");
    buffer.println(format!("#include \"{}\"", path_to_hfile).as_str());
    buffer.println("");
    buffer.println("int main()");
    buffer.println("{");
    buffer.println("");
    buffer.println_right("return 0;");
    buffer.println_left("}");

    return buffer;
}

pub fn template_for_examfile() -> CodeBuffer {
    let mut buffer = CodeBuffer::new(4);

    buffer.println("#include <stdio.h>");
    buffer.println("#include <stdlib.h>");
    buffer.println("#include <stdbool.h>");
    buffer.println("#include <string.h>");
    buffer.println("");
    buffer.println("int main()");
    buffer.println("{");
    buffer.println("");
    buffer.println_right("return 0;");
    buffer.println_left("}");

    return buffer;
}

// pub fn template_for_makefile_algo(mut hfile_name: String, mut main_name: String) -> CodeBuffer {
//     let mut buffer = CodeBuffer::new(4);

//     // Removing extensions
//     for _ in 0..2 {
//         hfile_name.pop();
//         main_name.pop();
//     }

//     buffer.println("# This file was automatically generated by `create-prog-app`");
//     buffer.println("CC:=gcc");
//     buffer.println("CFLAGS:=-Wall -Wextra -g -pedantic -fsanitize=address -fsanitize=leak");
//     buffer.println("LIBS:=-lm");
//     buffer.println("VPATH:=struct");
//     buffer.println("# Due to the oddity of MAKE and the fact you cannot generate \"true\" tabs,");
//     buffer.println("# the \"tab\" character is replaced by spaces.");
//     buffer.println("# `create-prog-app` STRONGLY advises you not to change/modify the line below");
//     buffer.println(".RECIPEPREFIX:=$(.RECIPEPREFIX) ");
//     buffer.println("");
//     buffer.println(
//         format!(
//             "{}: {}.o {}.o",
//             main_name.to_lowercase(),
//             main_name.to_lowercase(),
//             hfile_name.to_lowercase()
//         )
//         .as_str(),
//     );
//     buffer.println_right("$(CC) $(CFLAGS) $(LIBS) $^ -o $@");
//     buffer.println_left("");
//     buffer.println(format!("{0}.o: {0}.c", main_name.to_lowercase()).as_str());
//     buffer.println_right("$(CC) $(CFLAGS) $(LIBS) -c $<");
//     buffer.println_left("");
//     buffer.println(format!("{0}.o: {0}.c {0}.h", hfile_name.to_lowercase()).as_str());
//     buffer.println_right("$(CC) $(CFLAGS) $(LIBS) -c $<");
//     buffer.println_left("");
//     buffer.println("clean:");
//     buffer.println_right(format!("rm -f *.o {}", main_name.to_lowercase()).as_str());
//     buffer.println_left("");
//     buffer.println(format!("rebuild: clean {}", main_name.to_lowercase()).as_str());

//     return buffer;
// }

pub fn template_for_makefile_algo_v2(impl_name: String, mut main_name: String) -> CodeBuffer {
    let mut buffer = CodeBuffer::new(4);

    buffer.println("# This file was automatically generated by `create-prog-app`");
    buffer.println("CC := gcc");
    buffer.println("CFLAGS := -Wall -Wextra -g -pedantic -fsanitize=address -fsanitize=leak");
    buffer.println("LDFLAGS := -lm");
    buffer.println("VPATH := struct");
    buffer.println("");
    buffer.println(
        format!(
            "SOURCES := {} {}",
            main_name.to_lowercase(),
            impl_name.to_lowercase()
        )
        .as_str(),
    );

    for _ in 0..2 {
        main_name.pop();
    }

    buffer.println("OBJECTS := $(patsubst %.c, %.o, $(SOURCES))");
    buffer.println(format!("TARGET := {}", main_name).as_str());
    buffer.println("# Due to the oddity of MAKE and the fact you cannot generate \"true\" tabs,");
    buffer.println("# the \"tab\" character is replaced by spaces.");
    buffer.println("# `create-prog-app` STRONGLY advises you not to change/modify the line below");
    buffer.println(".RECIPEPREFIX:=$(.RECIPEPREFIX) ");
    buffer.println("");
    buffer.println("$(TARGET): $(OBJECTS)");
    buffer.println_right("$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)");
    buffer.println_left("");
    buffer.println(".PHONY: clean");
    buffer.println("");
    buffer.println("clean:");
    buffer.println_right("rm -f $(OBJECTS) $(TARGET)");

    return buffer;
}

pub fn template_for_makefile_exam(mut main_filename: String) -> CodeBuffer {
    let mut buffer = CodeBuffer::new(4);

    // Removing extensions
    for _ in 0..2 {
        // hfile_name.pop();
        main_filename.pop();
    }

    buffer.println("# This file was automatically generated by `create-prog-app`");
    buffer.println("CC:=gcc");
    buffer.println("CFLAGS:=-Wall -Wextra -g -pedantic -fsanitize=address -fsanitize=leak");
    buffer.println("LIBS:=-lm");
    buffer.println("VPATH:=struct");
    buffer.println("# Due to the oddity of MAKE and the fact you cannot generate \"true\" tabs,");
    buffer.println("# the \"tab\" character is replaced by spaces.");
    buffer.println("# `create-prog-app` STRONGLY advises you not to change/modify the line below");
    buffer.println(".RECIPEPREFIX:=$(.RECIPEPREFIX) ");
    buffer.println("");
    buffer.println(format!("{0}: {0}.c", main_filename.to_lowercase()).as_str());
    buffer.println_right("$(CC) $(CFLAGS) $(LIBS) $^ -o $@");
    buffer.println_left("");
    buffer.println("clean:");
    buffer.println_right(format!("rm -f *.o {}", main_filename.to_lowercase()).as_str());

    return buffer;
}