/* 
 * guessprime5.c - a C version of our simple bash demo program guessprime.sh
 * (simple replacement for the bash program).  
 * This version picks a random number (previously hard coded to 31)
 *
 * input: a guessed integer 
 * output: whether guessed integer matches random number
 *
 * compile: gcc -o guessprime guessprime5.c
 * usage: ./guessprime
 * 
 * Tim Pierson, Fall 2022, based on (or exactly copied from) prior term code from David Kotz
 * CS 50, Fall 2022
 * 
 */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>

// function prototype *declarations*
int pickPrime(const int max);
int readGuess(void);
bool isPrime(const int p);

// Main loop - ask for a guess, quit when it matches the answer
int main(int argc, char *argv[]) {
  const int answer = pickPrime(100);
  int guess;

  guess = readGuess();
  while (guess != 0 && guess != answer) {
    printf("Wrong! try again\n");
    guess = readGuess();
  }

  if (guess == 0) {
    printf("Hah! you gave up; the answer was %d\n", answer);
  }
  if (guess == answer) {
    printf("You win!\n");
  }

  return 0;  // exit status
}

// pick a random prime between 1..max
int pickPrime(const int max) {
  int p;

  srand(time(NULL)); // seed the random-number sequence

  // keep picking random numbers until we find a prime
  for (p = 0; !isPrime(p); p = (rand() % max + 1))
    ;

  return p;
}

// Prompt for, and read, one guess
// return 0 if they gave up
int readGuess(void) {
  int guess;

  printf("Enter a prime between 1-100 (give up? enter 0): ");
  scanf("%d", &guess);

  if (guess == 0) {
    return 0;
  }

  if (guess < 1 || guess > 100) {
    printf("Hey! %d is out of range [1..100].\n", guess);
  }
    
  if (!isPrime(guess)) {
    printf("Hey! %d is not even a prime number.\n", guess);
  }

  return guess;
}


// determine whether the number is prime
// (assumes n <= 100)
bool isPrime(const int n) {
  if (n < 2) return false;
  if (n > 2 && n%2 == 0) return false;
  if (n > 3 && n%3 == 0) return false;
  if (n > 5 && n%5 == 0) return false;
  if (n > 7 && n%7 == 0) return false;
  return true;
}