#include <time.h>
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "myc_str.h"
#include "myc_fortran.h"

typedef struct { char *instr; char *host; int port; char *user; int cod; } Instrument;
static Instrument list[]={
    { "DMC",   "pc4629.psi.ch", 9753, "dmc"   , 1},
    { "MORPHEUS", "pc4120.psi.ch", 9753, "morpheus" , 1},
    { "SANS",  "pc4122.psi.ch",   9753, "sans"  , 1},
    { "SANS2", "sans2.psi.ch",  9753, "sans2" , 1},
    { "HRPT",  "pc4630.psi.ch", 9753, "hrpt"  , 1},
    { "TRICS", "trics.psi.ch", 9753, "trics" , 1},
    { "AMOR",  "amor.psi.ch", 9753, "amor"  , 1},
    { "FOCUS", "focus.psi.ch", 9753, "focus" , 1},
    { "TASP",  "pc4478.psi.ch", 9753, "tasp",   1},
    { "RITA",  "pc4345.psi.ch", 9753, NULL    , 0},
    { "PREP",  "lns1se.psi.ch", 9753, "admin" , 0},
    { "AREA",  "lns1se.psi.ch", 9751, "admin" , 0},
    { "PREP1", "lnsl15.psi.ch", 9753, "l_samenv", 0},
    { "PREP2", "lnsl15.psi.ch", 9754, "l_samenv", 0},
    { "PREP3", "lnsl15.psi.ch", 9755, "l_samenv", 0},
    { "PREP4", "lnsl15.psi.ch", 9756, "l_samenv", 0},
    { "TEST",  "lnsa15.psi.ch", 9755, "lnslib", 2}
  };

int InstrHost(char *input, char *instr, char *host, char *user, char *pcod
    , int instr_len, int host_len, int user_len, int pcod_len) {
  char buf[256], *lnscode;
  int i, j;
  struct tm tim;
  time_t t;

  j=-1;
  str_upcase(buf, input);
  for (i = 0; i < sizeof(list) / sizeof(list[0]); i++) {
    if (0==strcmp(buf, list[i].instr)) {
      j=i;
    }
  }
  if (j<0) {
    str_lowcase(buf, input);
    for (i = 0; i < sizeof(list) / sizeof(list[0]); i++) {
      if (list[i].host==strstr(list[i].host, buf)) {
        if (j>=0) return 0;
        j=i;
      }
    }
  }
  if (j<0) return 0;
  str_ncpy(instr,list[j].instr, instr_len);
  str_ncpy(host, list[j].host, host_len);
  if (list[j].user != NULL) {
    str_ncpy(user,    list[j].user, user_len);
    if (list[j].cod == 1) {
      str_ncpy(pcod, instr, pcod_len);
      str_ncat(pcod, "LNS", pcod_len);
    } else if (list[j].cod == 2) {
      time(&t);
      tim=*localtime(&t);
      lnscode=getenv("LNSCODE");
      if (lnscode == NULL) {
        sprintf(pcod, "%02dlns%d", tim.tm_year % 100, tim.tm_mon/6+1);
      } else if (strlen(lnscode)==3) {
        sprintf(pcod, "%c%clns%c", lnscode[0], lnscode[1], lnscode[2]);
      } else {
        sprintf(pcod, "%02dlns%s", tim.tm_year % 100, lnscode);
      }
    } else {
      str_ncpy(pcod, " ", pcod_len);
    }
  }
  return list[j].port;
}


#ifdef F_CHAR
/* compile only when fortran c interface stuff is defined */

int F_FUN(instr_host)(F_CHAR(input), F_CHAR(instr), F_CHAR(host), F_CHAR(user), F_CHAR(pcod)
    , int input_len, int instr_len, int host_len, int user_len, int pcod_len) {
  char buf[256], in[256], ho[256], us[256], pc[256];
  int iRet;

  STR_TO_C(buf, input);
  iRet=InstrHost(buf, in, ho, us, pc, sizeof(in), sizeof(ho), sizeof(us), sizeof(pc));
  if (iRet>0) {
    STR_TO_F(instr, in);
    STR_TO_F(host, ho);
    STR_TO_F(user, us);
    STR_TO_F(pcod, pc);
  }
  return iRet;
}

#endif
