/*
    goahead.c -- Main program for GoAhead

    Usage: goahead [options] [documents] [IP][:port] ...
        Options:
        --auth authFile        # User and role configuration
        --background           # Run as a Linux daemon
        --home directory       # Change to directory to run
        --log logFile:level    # Log to file file at verbosity level
        --route routeFile      # Route configuration file
        --verbose              # Same as --log stdout:2
        --version              # Output version information

    Copyright (c) All Rights Reserved. See details at the end of the file.
 */

/********************************* Includes ***********************************/

#include    "goahead.h"

/********************************* Defines ************************************/

static int finished = 0;

/********************************* Forwards ***********************************/

static void initPlatform(void);
static void logHeader(void);
static void usage(void);

#if WINDOWS
static void windowsClose();
static int windowsInit();
static LRESULT CALLBACK websWindProc(HWND hwnd, UINT msg, UINT wp, LPARAM lp);
#endif

#if ME_UNIX_LIKE
static void sigHandler(int signo);
#endif

static void buy(Webs *wp);
static void actionTest(Webs *wp);
// static void personInfoAction(Webs *wp);


static void buy(Webs *wp)
{
    char    *name, *age;
    name = websGetVar(wp, "name", NULL);
    age = websGetVar(wp, "age", NULL);
     logmsg(2, "---------------------------------------------");
    logmsg(2, "name value is : %s", name );
     logmsg(2, "age value is : %s", age );
    websSetStatus(wp, 200);
    websWriteHeaders(wp, 0, 0);
    websWriteEndHeaders(wp);
    printf("aa");
    websWrite(wp, "Name %s", name); 
    websWrite(wp,  "Age %s", age);
    websFlush(wp, 0);
    websDone(wp);
}



/*
    Implement /action/actionTest. Parse the form variables: name, address and echo back.
 */
static void actionTest(Webs *wp)
{
    cchar   *name, *address;

    name = websGetVar(wp, "name", NULL);
    address = websGetVar(wp, "address", NULL);
    websSetStatus(wp, 200);
    websWriteHeaders(wp, -1, 0);
    websWriteEndHeaders(wp);
    websWrite(wp, "<html><body><h2>name: %s, address: %s</h2></body></html>\n", name, address);
    websFlush(wp, 0);
    websDone(wp);
}

/*********************************** Code *************************************/

MAIN(goahead, int argc, char **argv, char **envp)
{
   
    char    *argp, *home, *documents, *endpoints, *endpoint, *route, *auth, *tok, *lspec;
    int     argind;
	logmsg(2, "---> log1\n");
	error("---> log1\n");
#if WINDOWS
    if (windowsInit() < 0) {
        return 0;
    }
#endif
    route = "route.txt";
    auth = "auth.txt";

	error("---> main enter, argc = %d\n", argc);
    for (argind = 1; argind < argc; argind++) {
        argp = argv[argind];
		error("---> argp = %s\n", argp);
        if (*argp != '-') {
            break;

        } else if (smatch(argp, "--auth") || smatch(argp, "-a")) {
            if (argind >= argc) usage();
            auth = argv[++argind];

#if ME_UNIX_LIKE && !MACOSX
        } else if (smatch(argp, "--background") || smatch(argp, "-b")) {
            websSetBackground(1);
#endif

        } else if (smatch(argp, "--debugger") || smatch(argp, "-d") || smatch(argp, "-D")) {
            websSetDebug(1);

        } else if (smatch(argp, "--home")) {
            if (argind >= argc) usage();
            home = argv[++argind];
            if (chdir(home) < 0) {
                error("Cannot change directory to %s", home);
                exit(-1);
            }
			error("---> get home\n");
        } else if (smatch(argp, "--log") || smatch(argp, "-l")) {
            if (argind >= argc) usage();
            logSetPath(argv[++argind]);

        } else if (smatch(argp, "--verbose") || smatch(argp, "-v")) {
            logSetPath("stdout:2");
			error( "---> get -v\n");
        } else if (smatch(argp, "--route") || smatch(argp, "-r")) {
            route = argv[++argind];

        } else if (smatch(argp, "--version") || smatch(argp, "-V")) {
            printf("%s\n", ME_VERSION);
            exit(0);

        } else if (*argp == '-' && isdigit((uchar) argp[1])) {
            lspec = sfmt("stdout:%s", &argp[1]);
            logSetPath(lspec);
            wfree(lspec);

        } else {
            usage();
        }
    }
    documents = ME_GOAHEAD_DOCUMENTS;
    if (argc > argind) {
        documents = argv[argind++];
    }
	error("---> initPlatform\n");
    initPlatform();
    if (websOpen(documents, route) < 0) {
        error("Cannot initialize server. Exiting.");
        return -1;
    }
#if ME_GOAHEAD_AUTH
	error("---> ME_GOAHEAD_AUTH: %d\n", ME_GOAHEAD_AUTH);
    if (websLoad(auth) < 0) {
        error("Cannot load %s", auth);
        return -1;
    }
#endif
    logHeader();
	error("---> argind = %d, argc = %d\n", argind, argc);
    if (argind < argc) {
        while (argind < argc) {
            endpoint = argv[argind++];
            if (websListen(endpoint) < 0) {
                return -1;
            }
        }
    } else {
        endpoints = sclone(ME_GOAHEAD_LISTEN);
        for (endpoint = stok(endpoints, ", \t", &tok); endpoint; endpoint = stok(NULL, ", \t,", &tok)) {
#if !ME_COM_SSL
			error("ME_COM_SSL %d\n", ME_COM_SSL);
            if (strstr(endpoint, "https")) continue;
#endif
            if (websListen(endpoint) < 0) {
                wfree(endpoints);
                return -1;
            }
        }
        wfree(endpoints);
    }
#if ME_ROM && KEEP
    /*
        If not using a route/auth config files, then manually create the routes like this:
        If custom matching is required, use websSetRouteMatch. If authentication is required, use websSetRouteAuth.
     */
    websAddRoute("/", "file", 0);
#endif

//add by lusa start 
        websDefineAction("buy", buy);
        websDefineAction("test", actionTest);
        websDefineAction("person", personInfoAction);
        
// add by lusa end 
#ifdef GOAHEAD_INIT
    /*
        Define your init function in main.me goahead.init, or
        configure with DFLAGS=GOAHEAD_INIT=myInitFunction
     */
    {
        extern int GOAHEAD_INIT();

        if (GOAHEAD_INIT() < 0) {
            exit(1);
        }
    }
#endif
#if ME_UNIX_LIKE && !MACOSX
    /*
        Service events till terminated
     */
    if (websGetBackground()) {
        if (daemon(0, 0) < 0) {
            error("Cannot run as daemon");
            return -1;
        }
    }
#endif
	error( "---> websServiceEvents\n");
    websServiceEvents(&finished);
    logmsg(1, "Instructed to exit");
    websClose();
#if WINDOWS
    windowsClose();
#endif
    return 0;
}


static void logHeader(void)
{
    char    home[ME_GOAHEAD_LIMIT_STRING];

    getcwd(home, sizeof(home));
    logmsg(2, "Configuration for %s", ME_TITLE);
    logmsg(2, "---------------------------------------------");
    logmsg(2, "Version:            %s", ME_VERSION);
    logmsg(2, "BuildType:          %s", ME_DEBUG ? "Debug" : "Release");
    logmsg(2, "CPU:                %s", ME_CPU);
    logmsg(2, "OS:                 %s", ME_OS);
    logmsg(2, "Host:               %s", websGetServer());
    logmsg(2, "Directory:          %s", home);
    logmsg(2, "Documents:          %s", websGetDocuments());
    logmsg(2, "Configure:          %s", ME_CONFIG_CMD);
    logmsg(2, "---------------------------------------------");
}

static void usage(void) {
    fprintf(stderr, "\n%s Usage:\n\n"
        "  %s [options] [documents] [[IPaddress][:port] ...]\n\n"
        "  Options:\n"
#if ME_GOAHEAD_AUTH
        "    --auth authFile        # User and role configuration\n"
#endif
#if ME_UNIX_LIKE && !MACOSX
        "    --background           # Run as a Unix daemon\n"
#endif
        "    --debugger             # Run in debug mode\n"
        "    --home directory       # Change to directory to run\n"
        "    --log logFile:level    # Log to file file at verbosity level\n"
        "    --route routeFile      # Route configuration file\n"
        "    --verbose              # Same as --log stdout:2\n"
        "    --version              # Output version information\n\n",
        ME_TITLE, ME_NAME);
    exit(-1);
}


static void initPlatform(void)
{
#if ME_UNIX_LIKE
	error("---> initPlatform, ME_OS: %s\n", ME_OS);
    signal(SIGTERM, sigHandler);
    #ifdef SIGPIPE
		error("---> define SIGPIPE\n");
        signal(SIGPIPE, SIG_IGN);
    #endif
#elif ME_WIN_LIKE
    _fmode=_O_BINARY;
    printf("%s\n", "fff");
#endif
}


#if ME_UNIX_LIKE
static void sigHandler(int signo)
{
    finished = 1;
}
#endif


//#if WINDOWS
///*
//    Create a taskbar entry. Register the window class and create a window
// */
//static int windowsInit()
//{
//    HINSTANCE   inst;
//    WNDCLASS    wc;                     /* Window class */
//    HMENU       hSysMenu;
//    HWND        hwnd;
//
//    inst = websGetInst();
//    wc.style         = CS_HREDRAW | CS_VREDRAW;
//    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
//    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
//    wc.cbClsExtra    = 0;
//    wc.cbWndExtra    = 0;
//    wc.hInstance     = inst;
//    wc.hIcon         = NULL;
//    wc.lpfnWndProc   = (WNDPROC) websWindProc;
//    wc.lpszMenuName  = wc.lpszClassName = ME_NAME;
//    if (! RegisterClass(&wc)) {
//        return -1;
//    }
//    /*
//        Create a window just so we can have a taskbar to close this web server
//     */
//    hwnd = CreateWindow(ME_NAME, ME_TITLE, WS_MINIMIZE | WS_POPUPWINDOW, CW_USEDEFAULT,
//        0, 0, 0, NULL, NULL, inst, NULL);
//    if (hwnd == NULL) {
//        return -1;
//    }
//
//    /*
//        Add the about box menu item to the system menu
//     */
//    hSysMenu = GetSystemMenu(hwnd, FALSE);
//    if (hSysMenu != NULL) {
//        AppendMenu(hSysMenu, MF_SEPARATOR, 0, NULL);
//    }
//    ShowWindow(hwnd, SW_SHOWNORMAL);
//    UpdateWindow(hwnd);
//    return 0;
//}
//
//
//static void windowsClose()
//{
//    HINSTANCE   inst;
//
//    inst = websGetInst();
//    UnregisterClass(ME_NAME, inst);
//}
//
//
///*
//    Main menu window message handler.
// */
//static LRESULT CALLBACK websWindProc(HWND hwnd, UINT msg, UINT wp, LPARAM lp)
//{
//    switch (msg) {
//        case WM_DESTROY:
//            PostQuitMessage(0);
//            finished++;
//            return 0;
//
//        case WM_SYSCOMMAND:
//            break;
//    }
//    return DefWindowProc(hwnd, msg, wp, lp);
//}
//
//
///*
//    Check for Windows Messages
// */
//WPARAM checkWindowsMsgLoop()
//{
//    MSG     msg;
//
//    if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
//        if (!GetMessage(&msg, NULL, 0, 0) || msg.message == WM_QUIT) {
//            return msg.wParam;
//        }
//        TranslateMessage(&msg);
//        DispatchMessage(&msg);
//    }
//    return 0;
//}
//
//
///*
//    Windows message handler
// */
//static LRESULT CALLBACK websAboutProc(HWND hwndDlg, uint msg, uint wp, long lp)
//{
//    LRESULT    lResult;
//
//    lResult = DefWindowProc(hwndDlg, msg, wp, lp);
//
//    switch (msg) {
//        case WM_CREATE:
//            break;
//        case WM_DESTROY:
//            break;
//        case WM_COMMAND:
//            break;
//    }
//    return lResult;
//}
//
//#endif

/*
    Copyright (c) Embedthis Software. All Rights Reserved.
    This software is distributed under commercial and open source licenses.
    You may use the Embedthis GoAhead open source license or you may acquire
    a commercial license from Embedthis Software. You agree to be fully bound
    by the terms of either license. Consult the LICENSE.md distributed with
    this software for full details and other copyrights.
 */
