/* Fall 2022 Lab 6
   Cassandra Phillips
   CP SC 1011 Sec 001:
   Lab 6, Fall 2022
   5 October 2022
   * intro to PPM with creating a flag of Ireland
            green|white|orange
    * reinforces loops and arrays

    PPM images have 2 parts:
        header information
        pixel information

    An image is height (rows) X width (columns).
    So, a 300 X 600 image is 300 rows high and 600 columns wide.

    All of the image contents (header and pixel info) will be written
    to stdout so when we run the program with redirection, those items
    being sent to stdout will be redirected to a file

    For example, to run this program, you will type:
        ./a.out > flag.ppm
    and everything that was sent to stdout will be written to the file
    called  flag.ppm

    All the other statements that you want to go to the screen and not 
    the image will be written to stderr.

*/

#include <stdio.h>


int main (void){
    int width, height, i, j, k = 0;  // k is used for the array

    fprintf(stderr, "\n\nFlag of Ireland");
    fprintf(stderr, "\n\tWhat width do you want the flag to be? ");
    // 1. get the user's input for width
    scanf("%i", &width);
    

    // 2. calculate the height based on the proportion stated on Wikipedia
    height = width / 2;

    fprintf(stderr, "\n\nMaking the flag with width %d & height %d ...",
        width, height);
    fprintf(stderr, "\n\n");


    // 3. declare an array of type:  unsigned int
    // * it will need to be big enough to hold all the color values:
    // * each pixel is made up of red, green, and blue values
    //   so each pixel has 3 things in it
    // * therefore (HINT):  the width is actually 3 times bigger
    width *= 3;
    unsigned int pixel[height][width];


    // write to stdout the ppm header values 
    // * with redirection, these outputs will be written to the file
    fprintf(stdout, "P3\n");
    fprintf(stdout, "%d %d %d\n", width/3, height, 255);


    // 4. nested for loops for writing the pixel data:
    //     a.  outer for loop is for each row
    //     b.  because the flag of Irelad has 3 equal vertical parts,
    //        there will be 3 equal inner for loops, each one going
    //        1/3 of the way across the row (i.e. 1/3 of the columns)
    // pseudocode:
    // /*
    for (int i = 0; i < height; i++) {
    k = 0;
      for (; k < width/3; k+=3) {
          // fill in array with green 
            // which is r, g, b of:  0 128 0
            pixel[i][k] = 0;
            pixel[i][k+1] = 128;
            pixel[i][k+2] = 0;
        }
        for (; k < (2 * width)/3; k+=3) {
            // fill in array with white 
            // which is r, g, b of:  255 255 255 
            pixel[i][k] = 255;
            pixel[i][k+1] = 255;
            pixel[i][k+2] = 255;
        }
        for (; k < width; k+=3) {
            // fill in array with orange 
            // which is r, g, b of:  255 165 0 
            pixel[i][k] = 255;
            pixel[i][k+1] = 165;
            pixel[i][k+2] = 0;

        }
    }
    //*/
        

    // 5. print the contents of the array to stdout, so with redirection,
    //    the pixels will be written to the .ppm file
    //    * with P3, the unsigned int values must be written so that
    //      the values are 3 to a line (see lab write-up)
    // pseudocode:
    // /*
    i = 0;
    j = 0;
    for (; i < height; i++ ) {
    j = 0;
        // print each value from array to stdout
        for (; j < width; j+=3) {
            fprintf(stdout, "%d %d %d\n", pixel[i][j], pixel[i][j+1], pixel[i][j+2]);
        }
    }
    // */


    return 0;
}