#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <dos.h>
#define PTIME 20
#define SQty 1000
#define fname "material.txt"
#define fcode "code.txt"
#define ftemp "temp.txt"

FILE *fp,*fp1,*fp2;
char stoday[11];
int day_today=0;

/*struct tm
{
    int da_year;
    int da_mon;
    int da_day;       
};*/

struct data
{
    char m_no[10];
    char m_name[20];
    char m_date[11];
    long m_amount;
    char type;
    char m_rdate[11];  
    struct data* left;
    struct data* right;     
};

void load(FILE* fp);
void make_tree(struct data* m_data,struct data** head);
void traverse_tree(struct data** head);

struct data* head;

int main(void)
{
    FILE* fp=fopen("material.txt","r");
    load(fp);
    
    void print(void);
    void edit_code(void);
    void check_reserve(void);
    void record(char type);
    char* qtyCalc(char check_no[10],int s_day,int e_day);
    
    {
        //struct tm d;
         struct tm* local;
         time_t t;
         t=time(NULL);
         local=localtime(&t);
        
        sprintf(stoday,"%d/%d/%d",local->tm_year+1900,local->tm_mon+1,local->tm_mday);
        
        //printf("%s\n",stoday);
        day_today=dayCalc(stoday);      
    }     
    
    for(;;)
    {
        //clrscr();
        //system("cls");
        printf("\nMain Menu\n\(1)Sale.\n\(2)Order.\n\(3)Search and Print.\n\(4)Edit Code list\n\(5)Safety Stock\n\(0)Quit\n");
        printf("Please enter choice?");
        switch(getche())
        {
            case'0':exit(0);
            case'1':record('+');break;
            case'2':record('-');break;
            case'3':print();break;
            case'4':edit_code();break;
            case'5':check_reserve();break;
            default:printf("Input error!Please input 0~5\n");break;                
        }       
    }
    return 0;
}

void load(FILE* fp)
{
    char m_no[10],m_name[20],m_date[11],m_rdate[11],type;
    long m_amount;
    head=NULL;
    while(fscanf(fp,"%s%s%ld%c%s",m_no,m_date,&m_amount,&type,m_rdate)!=EOF)
    {
        struct data* m_data=(struct data*)malloc(sizeof(struct data));
        strcpy(m_data->m_no,m_no);
        strcpy(m_data->m_date,m_date);
        m_data->m_amount=m_amount;
        m_data->type=type;
        strcpy(m_data->m_rdate,m_rdate);   
        m_data->left=NULL;
        m_data->right=NULL;  
        
        make_tree(m_data,&head);
        printf("%s\n",head->m_no);                                                                   
    }     
    traverse_tree(&head);
}

void make_tree(struct data* t_data,struct data** t_head)
{
    //printf("------------------------------");
    if(*t_head==NULL)
    {
        t_head=&t_data;   
                    
    }
    else
    {
        if(strcmp((*t_head)->m_no,t_data->m_no)>0)
        {            
            {
                make_tree(t_data,&((*t_head)->left));    
            }                                       
        }  
        else if(strcmp((*t_head)->m_no,t_data->m_no)<=0)
        {
                make_tree(t_data,&((*t_head)->right));                                         
        }    
    }
   // printf("%s\n",(*t_head)->m_no);
}

int dayCalc(char sdate[])
{
    long year,month,day;
    char temp;
    int days[]={31,28,31,30,31,30,31,31,30,31,30,31};
    int i,total;
    sscanf(sdate,"%ld%c%ld%c%ld",&year,&temp,&month,&temp,&day);
    total=day+(month>2&&((year%4==0&&year%100!=0)||year%400==0));
    for(i=0;i<month-1;total+=days[i++]);
    return total;
}

void record(char type)
{
    long total=0,m_amount=0,in_amt=0,out_amt=0;
    char m_no[10],m_date[11],m_rdate[11];
    char *s_qty,temp;
    char* qtyCalc(char check_no[10],int s_day,int e_day);  
    printf("\n\n*****************************************************\n");
    fflush(stdin); 
    printf("No:");
    gets(m_no);
    //printf("%s\n",m_no);
    s_qty=qtyCalc(m_no,1,day_today+PTIME);
    //printf("%s\n",s_qty);
    sscanf(s_qty,"%ld%c%ld%c%ld",&in_amt,&temp,&out_amt,&temp,&total);
    if(total<SQty)
    {
        printf("The current safety stock qty is %ld\n",total);              
    }  
    printf("Date(yyyy/mm/dd):");
    gets(m_date);
    printf("Quantity:");
    scanf("%ld",&m_amount);
    
    if((fp=fopen(fname,"at"))==NULL)
        printf("file open error!\n"),exit(1);
    
    fprintf(fp,"%10s%15s%10ld%c%15s\n",m_no,m_date,m_amount,type,stoday);
    if(fclose(fp)==-1)
        printf("file close error!\n"),exit(1);
}

void print(void)
{
    void search1(void);
    void search2(void);
    for(;;)
    {
        //clrscr();
        system("cls");
        printf("\nsearch & print database\n\(1)query single material\n\(2)query all materials\n\(0)back to mainmenu\n");
        printf("enter choice?");
        switch(getche())
        {
            case'0':main();break;
            case'1':search1();break;
            case'2':search2();break;
            default:printf("input error!please input0~2\n");break;
        }       
    }     
}

void edit_code(void)
{
    char temp[20],code_no[10],code_name[20];
    printf("\n\n***************************************\n");
    fflush(stdin);
    printf("No:");
    gets(temp);
    if((fp1=fopen(fcode,"a+t"))==NULL)
        printf("file open error!(code file)\n"),exit(1);
       
    while(fscanf(fp1,"%10s%20s",code_no,code_name)!=EOF)
    {
        if(strcmp(code_no,temp)==0)
        {
            fclose(fp1);
            printf("duplicate code NO!\n");
            printf("go back to main menu.please press any key......");
            getche();
            main();                           
        }                                                    
    }     
    fprintf(fp1,"%10s",temp);
    printf("Name:");
    fprintf(fp1,"%20s",gets(temp));
    fprintf(fp1,"\n");
    if(fclose(fp1)==-1)
        printf("file close error!\n"),exit(1);
}

void check_reserve(void)
{
    char code_no[10],code_name[20];
    long total=0,in_amt=0,out_amt=0;
    char *s_qty,temp;
    int e_day=0;
    
    if((fp1=fopen(fcode,"r"))==NULL)
        printf("file read error(code file)\n"),exit(1); 
        
    printf("\n--------------------------------------------\n");
    printf("material no material name safety stock");
    printf("\n--------------------------------------------\n");
    
    e_day=day_today+PTIME;
    while(fscanf(fp1,"%10s%20s",code_no,code_name)!=EOF)
    {
        s_qty=qtyCalc(code_no,1,e_day);
        sscanf(s_qty,"%ld%c%ld%c%ld",&in_amt,&temp,&out_amt,&temp,&total);
        if(total<SQty)
            printf("%s%22s%18ld\n",code_no,code_name,total);                                                    
    }    
    if(fclose(fp1)==-1)
        printf("\n\npress any key to continue...!");
        getche();
}

char* qtyCalc(char check_no[10],int s_day,int e_day)
{
    char m_no[10],m_name[20],m_date[11],m_rdate[11],type;
    
    long m_amount,total=0,in_amt=0,out_amt=0;
    int m_day=0;
    static char sqty[30];
    
    if((fp=fopen(fname,"r"))==NULL)
        printf("file read error(database file)!"),exit(1);
        
    while(fscanf(fp,"%s%s%ld%c%s",m_no,m_date,&m_amount,&type,m_rdate)!=EOF)
    {
       // printf("%ld%c\n",m_amount,type);
        m_day=dayCalc(m_date);
        if((strcmp(m_no,check_no)==0)&&(s_day<=m_day)&&(m_day<=e_day))
        {
            if(type=='+')
                total+=m_amount,in_amt+=m_amount;
            if(type=='-')
                total-=m_amount,out_amt+=m_amount;                                                             
        }   
       // printf("%ld%ld%ld\n",in_amt,out_amt,total);                                                                     
    }      
    sprintf(sqty,"%ld/%ld/%ld",in_amt,out_amt,total);
    //printf("%s",sqty);
    if(fclose(fp)==-1)
        printf("file close error!\n"),exit(1);
        return sqty;
}

void search1(void)
{
    char search_no[10],m_no[10],m_date[11],type,m_rdate[11],p,*s_qty,temp;
    char Q[31][11];
    long Q1[31][3];
    long m_amount=0,in_amt=0,out_amt=0,total=0,ftotal=0;
    int m_day,i,j=0;
    
    for(i=0;i<=30;i++)
    {
        strcpy(Q[i],"");
        Q1[i][0]=0,Q1[i][1]=0,Q1[i][2]=0;                  
    }                                    
    printf("\n\n查詢今日前後15天的進出貨狀況\n");
    fflush(stdin);
    printf("\nPlease input material NO:");
    gets(search_no); 
    s_qty=qtyCalc(search_no,1,day_today-16);
    
    if((fp=fopen(fname,"r"))==NULL)
        printf("file read error...!"),exit(1);
        
    sscanf(s_qty,"%ld%c%ld%c%ld",&in_amt,&temp,&out_amt,&temp,&total);
    printf("\nthe safety stock of no.%s:%ld\n",search_no,total); 
    ftotal=total;
    printf("\n-------------------------------------------------------\n");
    printf("    date    order    sale    stock\n");
    printf("--------------------------------------------------------\n");
    
    while(fscanf(fp,"%s%s%ld%c%s",m_no,m_date,&m_amount,&type,m_rdate)!=EOF)
    {
        m_day=dayCalc(m_date);
        if((strcmp(m_no,search_no)==0)&&((day_today-15)<=m_day)&&(m_day<=(day_today+15)))
        {
            if(type=='+')
            {
                Q1[m_day-day_today+15][0]+=m_amount;
                Q1[m_day-day_today+15][2]+=m_amount;             
            }                                       
            if(type=='-')
            {
                Q1[m_day-day_today+15][1]+=m_amount;
                Q1[m_day-day_today+15][2]-=m_amount;             
            }                             
            if(strcmp(Q[m_day-day_today+15],"")==0)
                strcpy(Q[m_day-day_today+15],m_date);             
        }                                            
                                    
    }   
    if(fclose(fp)==-1)
        printf("file close error!\n"),exit(1);
        
    for(i=0;i<=30;i++)
    {
        Q1[i][2]=Q1[i][2]+total;
        total=Q1[i][2];
        if(strcmp(Q[i],"")!=0)
        {
            printf("%10s%15ld%15ld%15ld\n",Q[i],Q1[i][0],Q1[i][1],Q1[i][2]),j++;
            if(j==15)
                printf("--more--\n"),getch();                      
        }                  
    }                              
    fflush(stdin);
    printf("do you want to save the result(Y/N)?");
    scanf("%c",&p);
    if((p=='Y')||(p=='y'))
    {
        if((fp2=fopen(ftemp,"w"))==NULL)
            printf("file open error!\n"),exit(1);
            
        fprintf(fp2,"\nthe safety stock of no%s:%ld\n",search_no,ftotal);
        fprintf(fp2,"\n----------------------------------------------\n");
        fprintf(fp2,"    date    order    sale    stock\n");
        fprintf(fp2,"\n----------------------------------------------\n");
        
        for(i=0;i<=30;i++)
        {
            if(strcmp(Q[i],"")!=0)
                fprintf(fp2,"%10s%15ld%15ld%15ld\n",Q[i],Q1[i][0],Q1[i][1],Q1[i][2]);                  
        }                      
        if(fclose(fp2)==-1)
            printf("file close error!\n"),exit(1);
            
        printf("\nfile name:temp.txt\n");
    }
    printf("\npress any key to continue...!");
    getche();
}

void search2(void)
{
    char search_date[11];
    char code_no[10],code_name[20];
    char *s_qty,temp,p;
    int day_search=0;
    long in_amt=0,out_amt=0,total=0;
    fflush(stdin);
    printf("\n查詢至輸入的日期截止，所有進出貨的存貨狀況\n");
    printf("please input the deadline(yyyy/mm/dd):");
    gets(search_date);
    day_search=dayCalc(search_date);
    printf("do you want to save the result(Y/N)?");
    scanf("%c",&p); 
    printf("\n---------------------------------------------\n");
    printf("material no    order    sale    stock\n");
    printf("----------------------------------------------\n");  
    if((p=='Y')||(p=='y'))
    {
        if((fp2=fopen(ftemp,"w"))==NULL)
            printf("file open error!\n"),exit(1);
            
        fprintf(fp2,"\nthe deadline:%s\n",search_date);
        fprintf(fp2,"\n----------------------------------------------\n");
        fprintf(fp2,"material no    order    sale    stock\n");
        fprintf(fp2,"----------------------------------------------\n");                      
    }  
    if((fp1=fopen(fcode,"r"))==NULL)
        printf("file read error...(code file)\n"),exit(1);
        
    while(fscanf(fp1,"%10s%20s",code_no,code_name)!=EOF)
    {
        s_qty=qtyCalc(code_no,1,day_search);
       // printf("%d\n",day_search);
       // printf("%s\n",s_qty);
        sscanf(s_qty,"%ld%c%ld%c%ld",&in_amt,&temp,&out_amt,&temp,&total);
        /*printf("s_qty=%s\n",s_qty);
        printf("in_amt=%d\n",in_amt);
        printf("out_amt=%d\n",out_amt);
        printf("total=%d\n",total);*/
        printf("%8s %10ld %10ld %10ld\n",code_no,in_amt,out_amt,total);
        if((p=='Y')||(p=='y'))
            fprintf(fp2,"%10s %15ld %15ld %15ld\n",code_no,in_amt,out_amt,total);
            total=0,in_amt=0,out_amt=0;                                                    
    }
    if(fclose(fp1)==-1)
        printf("file close error!\n"),exit(1);
        
    if((p=='Y')||(p=='y'))
    {
        if(fclose(fp2)==-1)
            printf("file close error!\n"),exit(1);
            
        printf("\nfile name:temp.txt\n");                     
    }
    printf("\npress any key to continue...!");getche();
}

void traverse_tree(struct data** head)
{
    //printf("----------------------\n");
    if(*head==NULL)
    {
        printf("------------------------\n");
        return;              
    }
    else
    {
       // printf("------------------------\n");
        printf("%s %d\n",(*head)->m_no,(*head)->m_date);
        traverse_tree(&((*head)->left));
        traverse_tree(&((*head)->right));  
    }  
   // printf("------------------------\n"); 
}
