/* **********************************************************************************************
   Program to convert Proform comma separated output file, into binary ready for testing 20/09/06
   ********************************************************************************************** */

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include "horses.h"

            /***** NOTE:  Need to delete header/column line on first line of csv.txt file before running program *****/
int ptr_ctr;

int main()
{
    FILE *fp_in,
         *fp_out;

    struct proform pro_data;

    char raw_data[350],
             *temp_ptr,
             *raw_ptr;

    fp_in  = open_file("feb2006-mar2007.txt","rt");
    fp_out = open_file("pro1.bin","wb");

    char date_time[21]              ="";
    char course[25]                 ="";
    char course_direction[3]        ="";
    char course_characteristics[20] ="";
    char distance[11]               ="";
    char prize[9]                   ="";
    char race_type[10]              ="";
    char runners[3]                 ="";
    char race_class[2]              ="";
    char new_class_num[2]           ="";
    char min_age[2]                 ="";
    char max_age[2]                 ="";
    char handicap_limit[3]          ="";
    char tricast[8]                 ="";
    char exacta[8]                  ="";
    char csf[8]                     ="";
    char going[20]                  ="";
    char official_going[20]         ="";
    char classifications[30]        ="";
    char date[11]                   ="";
    char race_time[6]               ="";
    char racecard_num[4]            ="";
    char draw[3]                    ="";
    char fin_pos [3]                ="";
    char horse[30]                  ="";
    char horse_country[10]          ="";
    char jockey[20]                 ="";
    char jockey_claim[4]            ="";
    char trainer[30]                ="";
    char tissue_rating[4]           ="";
    char odds_text[6]               ="";
    char odds_value[6]              ="";
    char age[3]                     ="";
    char weight[4]                  ="";
    char pace_abbrev[2]             ="";
    char dslr[5]                    ="";
    char fav[2]                     ="";
    char pace_rating[5]             ="";
    char or[3]                      ="";
    char proform_speed_rating[4]    ="";
    char dist_to_next[5]            ="";
    char dist_to_winner[5]          ="";
    char user_rating_1[6]           ="";
    char user_rating_2[6]           ="";
    char user_rating_3[6]           ="";
    char tissue_odds_text[6]        ="";
    char tissue_odds_value[4]       ="";
    char proform_form_rating[4]     ="";
    char tis_prf[5]                 ="";
    char highest_rating[3]          ="";
    char lto_rating[3]              ="";
    char ave_rating_all[3]          ="";
    char ave_rating_three[3]        ="";
    char median_rating[3]           ="";
    char median_rating_three[3]     ="";
    char second_highest_rating[3]   ="";
    char vdw[5]                     ="";
    char highest_class_rating[3]    ="";
    char race_class_lto[3]          ="";
    char new_class_lto[3]           ="";
    char distance_lto[11]           ="";
    char value_lto[8]               ="";
    char pounds_lto[4]              ="";
    char finished_races_sr[7]       ="";
    char runs_before[4]             ="";
    char won_before[4]              ="";
    char won_sr_before[7]           ="";
    char profit_loss  [7]           ="";
    char plc_before[4]              ="";
    char plc_sr_before[4]           ="";


    while( fgets(raw_data,349,fp_in) != NULL)
    {

         raw_ptr = raw_data;

         ptr_ctr = 0;

         temp_ptr = date_time;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = course;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = course_direction;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = course_characteristics;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = distance;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = prize;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = race_type;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = runners;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = race_class;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = new_class_num;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = min_age;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = max_age;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = handicap_limit;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = tricast;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = exacta;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = csf;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = going;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = official_going;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = classifications;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = date;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = race_time;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = racecard_num;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = draw;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = fin_pos;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = horse;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = horse_country;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = jockey;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = jockey_claim;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = trainer;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = tissue_rating;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = odds_text;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = odds_value;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = age;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = weight;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = pace_abbrev;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = dslr;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = fav;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = pace_rating;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = or;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = proform_speed_rating;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = dist_to_next;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = dist_to_winner;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = user_rating_1;      /* user_rating 1 & 2, kept in so reading from txt file in correct order */
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = user_rating_2;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = user_rating_3;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = tissue_odds_text;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = tissue_odds_value;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = proform_form_rating;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = tis_prf;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = highest_rating;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = lto_rating;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = ave_rating_all;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = ave_rating_three;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = median_rating;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = median_rating_three;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = second_highest_rating;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = vdw;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = highest_class_rating;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = race_class_lto;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = new_class_lto;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = distance_lto;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = value_lto;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = pounds_lto;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = finished_races_sr;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = runs_before;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = won_before;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = won_sr_before;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = profit_loss;
         fill_temp(raw_ptr,temp_ptr);
         temp_ptr = plc_before;
         fill_temp(raw_ptr,temp_ptr);
  /*       temp_ptr = plc_sr_before;
         fill_temp(raw_ptr,temp_ptr); */




         /* insert longs into struct */

         pro_data.value_lto = atol(value_lto);



         /* insert int's into struct */

         pro_data.runners              = atoi(runners);
         pro_data.new_class_num        = atoi(new_class_num);
         pro_data.min_age              = atoi(min_age);
         pro_data.max_age              = atoi(max_age);
         pro_data.handicap_limit       = atoi(handicap_limit);
         pro_data.racecard_num         = atoi(racecard_num);
         pro_data.draw                 = atoi(draw);
         pro_data.fin_pos              = atoi(fin_pos);
         pro_data.jockey_claim         = atoi(jockey_claim);
         pro_data.tissue_rating        = atoi(tissue_rating);
         pro_data.age                  = atoi(age);
         pro_data.weight               = atoi(weight);
         pro_data.dslr                 = atoi(dslr);
         pro_data.pace_rating          = atoi(pace_rating);
         pro_data.or                   = atoi(or);
         pro_data.proform_speed_rating = atoi(proform_speed_rating);
         pro_data.user_rating_3        = atoi(user_rating_3);
         pro_data.proform_form_rating  = atoi(proform_form_rating);
         pro_data.tis_prf              = atoi(tis_prf);
         pro_data.highest_rating       = atoi(highest_rating);
         pro_data.lto_rating           = atoi(lto_rating);
         pro_data.ave_rating_all       = atoi(ave_rating_all);
         pro_data.ave_rating_three     = atoi(ave_rating_three);
         pro_data.median_rating        = atoi(median_rating);
         pro_data.median_rating_three  = atoi(median_rating_three);
         pro_data.second_highest_rating = atoi(second_highest_rating);
         pro_data.pounds_lto           = atoi(pounds_lto);
         pro_data.runs_before          = atoi(runs_before);
         pro_data.won_before           = atoi(won_before);
         pro_data.plc_before           = atoi(plc_before);
         pro_data.fav                  = atoi(fav);
         pro_data.sort_sp_order               = 0;
         pro_data.sort_weight                 = 0;
         pro_data.sort_eq_rating              = 0;
         pro_data.sort_eq_tissue              = 0;
         pro_data.sort_proform_speed_rating   = 0;
         pro_data.sort_proform_form_rating    = 0;
         pro_data.sort_proform_tissue         = 0;
         pro_data.sort_proform_tis_prf        = 0;
         pro_data.sort_proform_median         = 0;
         pro_data.sort_proform_highest_class  = 0;
         pro_data.sort_proform_highest_rating = 0;
         pro_data.sort_proform_ave_rating     = 0;
         pro_data.sort_second_highest_rating  = 0;
         pro_data.sort_vdw                    = 0;
         pro_data.sort_dslr                   = 0;




         /* insert floats into struct*/
         pro_data.prize                = atof(prize);
         pro_data.tricast              = atof(tricast);
         pro_data.exacta               = atof(exacta);
         pro_data.csf                  = atof(csf);
         pro_data.odds_value           = atof(odds_value);
         pro_data.tissue_odds_value    = atof(tissue_odds_value);
         pro_data.finished_races_sr    = atof(finished_races_sr);
         pro_data.won_sr_before        = atof(won_sr_before);
         pro_data.plc_sr_before        = atof(plc_sr_before);
         pro_data.eq_rating            = -200.00;
         pro_data.eq_tissue            =  200.00;                     /* needs to be postive for soring */
         pro_data.value_lto            = atof(value_lto);
         pro_data.profit_loss          = atof(profit_loss);
         pro_data.dist_to_next         = atof(dist_to_next);
         pro_data.dist_to_winner       = atof(dist_to_winner);
         pro_data.vdw                  = atof(vdw);
         pro_data.calc_1               = 0;
         pro_data.calc_2               = 0;
         pro_data.calc_3               = 0;
         pro_data.calc_4               = 0;
         pro_data.calc_5               = 0;
         pro_data.calc_6               = 0;
         pro_data.calc_7               = 0;
         pro_data.calc_8               = 0;
         pro_data.calc_9               = 0;
         pro_data.calc_10              = 0;



         /* insert chars into struct  */
         strcpy(pro_data.date_time,date_time);
         strcpy(pro_data.course,course);
         strcpy(pro_data.course_direction,course_direction);
         strcpy(pro_data.course_characteristics,course_characteristics);
         strcpy(pro_data.race_type,race_type);
         strcpy(pro_data.race_class,race_class);
         strcpy(pro_data.going,going);
         strcpy(pro_data.official_going,official_going);
         strcpy(pro_data.classifications,classifications);
         strcpy(pro_data.horse,strupr(horse));
         strcpy(pro_data.horse_country,horse_country);
         strcpy(pro_data.jockey,jockey);
         strcpy(pro_data.trainer,trainer);
         strcpy(pro_data.odds_text,odds_text);
         strcpy(pro_data.pace_abbrev,pace_abbrev);
         strcpy(pro_data.race_class_lto,race_class_lto);
         strcpy(pro_data.new_class_lto,new_class_lto);
         strcpy(pro_data.tissue_odds_text,tissue_odds_text);
         strcpy(pro_data.highest_class_rating,highest_class_rating);
         strcpy(pro_data.distance,distance);
         strcpy(pro_data.distance_lto,distance_lto);
         strcpy(pro_data.date,date);
         strcpy(pro_data.race_time,race_time);


         if( pro_data.dslr == 0 )
              pro_data.dslr = 5000;


         if( fwrite(&pro_data,sizeof(struct proform),1,fp_out) != 1)
         {
              printf("Error writing to races file....Exiting");
              exit(1);
         }

    }/*end while */

    printf("Program Successful");
    fclose(fp_in);
    fclose(fp_out);
    getch();
    return 0;

}/* end main */

/*-------------------------------------------------------------------------------------------------------------
 Function: fill_temp
 Purpose : copies data from the csv file, into character array ready for converting into structures (binary)
 Returns : nothing
 -------------------------------------------------------------------------------------------------------------*/

 void fill_temp(char *raw_ptr, char *temp_ptr)
 {
       raw_ptr += ptr_ctr;

       while(*raw_ptr != ',' && *raw_ptr != '\n')
       {
           *temp_ptr = *raw_ptr;
           temp_ptr++;
           raw_ptr++;
           ptr_ctr++;
       }
       *temp_ptr = '\0';
       raw_ptr++;
       ptr_ctr++;
}


/*-----------------------------------HEADER FILE----------------------------------------------------------*/


FILE * open_file(char *f_name, char *mode);
void fill_temp(char *raw_ptr, char *temp_ptr);
void fill_horse_name(char *raw_ptr, char *temp_ptr);


 struct todays_runners {
     char date_time[21];
     char course[25];
     char trainer[30];
     char jockey[20];
     char horse[30];
 };

 struct eqform {
    char date[11];
    char race_time[5];
    char horse_name[30];
    float eq_rating;
    float eq_price;
 };

 struct proform {
    char  date_time[21];
    char  course[25];
    char  course_direction[3];
    char  course_characteristics[20];
    char  distance[11];
    float prize;
    char  race_type[10];
    int   runners;
    char  race_class[2];
    int   new_class_num;
    int   min_age;
    int   max_age;
    int   handicap_limit;
    float tricast;
    float exacta;
    float csf;
    char  going[20];
    char  official_going[20];
    char  classifications[30];
    char  date[11];
    char  race_time[6];
    int   racecard_num;
    int   draw;
    int   fin_pos;
    char  horse[30];
    char  horse_country[10];
    char  jockey[20];
    int   jockey_claim;
    char  trainer[30];
    int   tissue_rating;
    char  odds_text[6];
    float odds_value;
    int   age;
    int   weight;
    char  pace_abbrev[2];
    int   dslr;
    int   fav;
    int   pace_rating;
    int   or;
    int   proform_speed_rating;
    float dist_to_next;
    float dist_to_winner;
    float eq_rating;
    float eq_tissue;
    int   user_rating_3;
    char  tissue_odds_text[6];
    float tissue_odds_value;
    int   proform_form_rating;
    int   tis_prf;
    int   highest_rating;
    int   lto_rating;
    int   ave_rating_all;
    int   ave_rating_three;
    int   median_rating;
    int   median_rating_three;
    int   second_highest_rating;
    float vdw;
    char  highest_class_rating[3];
    char  race_class_lto[3];
    char  new_class_lto[3];
    char  distance_lto[11];
    float value_lto;
    int   pounds_lto;
    float finished_races_sr;
    int   runs_before;
    int   won_before;
    float won_sr_before;
    float profit_loss;
    int   plc_before;
    float plc_sr_before;
    int   sort_eq_rating;
    int   sort_eq_tissue;
    int   sort_sp_order;
    int   sort_weight;
    int   sort_proform_speed_rating;
    int   sort_proform_form_rating;
    int   sort_proform_tissue;
    int   sort_proform_tis_prf;
    int   sort_proform_median;
    int   sort_proform_highest_class;  /* not used at present as refers to class by letter ie, A, B, etc. */
    int   sort_proform_highest_rating;
    int   sort_proform_ave_rating;
    int   sort_second_highest_rating;
    int   sort_vdw;
    int   sort_dslr;
    float calc_1;
    float calc_2;
    float calc_3;
    float calc_4;
    float calc_5;
    float calc_6;
    float calc_7;
    float calc_8;
    float calc_9;
    float calc_10;
};






/*--------------------------------------------------------------------------------------
 Function:  open_file
 Purpose:   Opens file according to arguments passed or exits program if error occurs
 Returns:   FILE ptr
 ---------------------------------------------------------------------------------------*/
FILE * open_file(char *fname, char *mode)
{
   FILE *fp;

   if( (fp = fopen(fname, mode) ) == NULL)
   {
      printf("\nError opening %s ...Exiting", fname);
      exit(1);
   }
   return fp;
}
