//
// Programmer:    Craig Stuart Sapp <craig@ccrma.stanford.edu>
// Creation Date: Mon Feb 25 21:15:21 PST 2002
// Last Modified: Mon Feb 25 21:15:24 PST 2002
// Filename:      ...sig/examples/all/staffinfo.cpp
// Web Address:   http://sig.sapp.org/examples/museinfo/score/staffinfo.cpp
// Syntax:        C++; museinfo
//
// Description:   Display staff information for a SCORE page file.
//

#include "ScorePage.h"
#include "Options.h"

#include <string.h>
#include <stdlib.h>


// function declarations:
void      checkOptions(Options& opts, int argc, char* argv[]);
void      example(void);
void      usage(const char* command);
void      printSystemInfo(ScorePage& page);


// interface variables:
Options options;
int     verboseQ   = 0;           // used with -v option
int     debugQ     = 0;           // used with --debug option
int     durationQ  = 0;           // used with -d option
const char* outputfilename = "";  // used with -o option


//////////////////////////////////////////////////////////////////////////

int main(int argc, char** argv) {
   checkOptions(options, argc, argv);

   if (options.getArgCount() == 0) {
      cout << "Usage: " << argv[0] << " input.mus " << endl;
      exit(1);
   }

   ScorePage scorepage;
   for (int i=1; i<=options.getArgCount(); i++) {
      scorepage.readFile(options.getArg(i), verboseQ);
      scorepage.analyzeContent();
      printSystemInfo(scorepage);
   }

   return 0;
}


//////////////////////////////////////////////////////////////////////////

///////////////////////////////
//
// printSystemInfo --
//

void printSystemInfo(ScorePage& page) {
   page.analyzeSystems();
   cout << "Number of staves     : " << page.getStaffCount()  << "\n";
   cout << "Maximum staff number : " << page.getMaxStaff()    << "\n";
   cout << "Number of systems    : " << page.getSystemCount() << "\n";

   int i, j;
   int staffnum;
   int barheight;
   for (i=0; i<page.getSystemCount(); i++) {
      cout << "System " << i+1 << endl;
      if (durationQ) {
         cout << "\tDuration: " << page.getSystemDuration(i) 
              << " quarter notes" << "\n";
      }
      cout << "\tStaves: " << page.getSystemStaffCount(i) << "\n";
      for (j=page.getSystemStaffCount(i)-1; j>=0; j--) {
         staffnum = page.getSystemStaffP2(i,j);

         cout << "\t\t" << "Staff ";
         if (staffnum < 10) {
            cout << " ";
         }
         cout << staffnum;
         cout << endl;

         cout << "\t\t\t" << "MaxBarHeight:";
         barheight = page.getMaxBarlineLength(i,j);
         cout  << barheight;
         if (barheight > 1) {
            cout << " staves";
         } else {
            cout << " staff";
         }
         cout << "\n";
      }
   }
}



//////////////////////////////
//
// checkOptions -- validate and process command-line options.
//

void checkOptions(Options& opts, int argc, char* argv[]) {
   opts.define("v|verbose=b", "verbose display of information");
   opts.define("d|duration=b", "display duration of systems");
   opts.define("I|no-invisible=b", "do not dispay invisible rests");

   opts.define("debug=b");              // determine bad input line num
   opts.define("author=b");             // author of program
   opts.define("version=b");            // compilation info
   opts.define("example=b");            // example usages
   opts.define("h|help=b");             // short description
   opts.process(argc, argv);
   
   // handle basic options:
   if (opts.getBoolean("author")) {
      cout << "Written by Craig Stuart Sapp, "
           << "craig@ccrma.stanford.edu, Jul 2012" << endl;
      exit(0);
   } else if (opts.getBoolean("version")) {
      cout << argv[0] << ", version: 29 Jul 2012" << endl;
      cout << "compiled: " << __DATE__ << endl;
      exit(0);
   } else if (opts.getBoolean("help")) {
      usage(opts.getCommand());
      exit(0);
   } else if (opts.getBoolean("example")) {
      example();
      exit(0);
   }

   verboseQ   =  opts.getBoolean("verbose");
   debugQ     =  opts.getBoolean("debug");
   durationQ  =  opts.getBoolean("duration");
}



//////////////////////////////
//
// example -- example usage of the quality program
//

void example(void) {
   cout <<
   "                                                                         \n"
   << endl;
}



//////////////////////////////
//
// usage -- gives the usage statement for the meter program
//

void usage(const char* command) {
   cout <<
   "                                                                         \n"
   << endl;
}


// md5sum: e9a4e72e84b3c90c266e3f3360115189 spageinfo.cpp [20120811]