setBasePath("/api");
// Add middleware
new middleware($app);
$timelineData = new timelineData();
$projectData = new projectData();
$user = new user();
$app->get("/timelineData/{timeline}", function (Request $request, Response $response, array $args)
{
    global $timelineData;
    //check if route is available if it is get the data
    //otherwise return an error
    if($args["timeline"] == "edu")
    {
        $response->getBody()->write(json_encode($timelineData->getEduData()));
        return $response;
    }
    
    if($args["timeline"] == "work")
    {
        $response->getBody()->write(json_encode($timelineData->getWorkData()));
        return $response;
    }
    
    // something went wrong
    $response->getBody()->write(json_encode(array("errorMessage" => "Error, timeline data not found")));
    return $response->withStatus(404);
});
$app->get("/projectData", function (Request $request, Response $response)
{
    global $projectData;
    $result = $projectData->getProjectData();
    $json = json_encode($result);
    $response->getBody()->write($json);
    if(array_key_exists("errorMessage", $result))
    {
        $response = $response->withStatus(404);
    }
    //use content type json to indicate json data on frontend.
    return $response;
});
$app->post("/contact", function (Request $request, Response $response)
{
    $data = $request->getParsedBody();
    if(empty($data["fName"]) || empty($data["lName"]) || empty($data["email"]) || empty($data["subject"]) || empty($data["message"]))
    {
      $response->getBody()->write(json_encode(array("errorMessage" => "Please fill out all the fields")));
      return $response->withStatus(400);
    }
    
    if (!filter_var($data["email"], FILTER_VALIDATE_EMAIL)) 
    {
      $response->getBody()->write(json_encode(array("errorMessage" => "Email is not the correct format")));
      return $response->withStatus(400);
    }
    
    // email form filler/conatcter
    $headers1 = "From: noreply@rohitpai.co.uk\r\n";
    $headers1 .= "Reply-To: rohit@rohitpai.co.uk\r\n";
    $headers1 .= "MIME-Version: 1.0\r\n";
    $headers1 .= "Content-Type: text/html; charset=UTF-8\r\n";
    
    $message1 = "
    
    
    {$data['subject']}
    
    
    
        Thank you for filling out the form on my website, I will try to respond to your query as soon as I can.
        
        Below is what you filled in for your record
        
            
                | Firstname | 
                Lastname | 
                Email | 
                Subject | 
                message | 
            
            
                | {$data['fName']} | 
                {$data['lName']} |          
                {$data['email']} | 
                {$data['subject']} | 
                {$data['message']} | 
            
        
        
        
        Regards, 
 Rohit Pai 
 rohit@rohitpai.co.uk
    
    
    ";
    
    mail($data["email"], $data["subject"], $message1, $headers1);
    
    // email to me
    $headers2 = "From: noreply@rohitpai.co.uk\r\n";
    $headers2 .= "Reply-To: {$data['email']}\r\n";
    $headers2 .= "MIME-Version: 1.0\r\n";
    $headers2 .= "Content-Type: text/html; charset=UTF-8\r\n";
    
    $message2 = "
    
    
    {$data['subject']}
    
    
    
        {$data['fName']} {$data['lName']} filled in the form on the website, here is what they sent.
        
            
                | Firstname | 
                Lastname | 
                Email | 
                Subject | 
                message | 
            
            
                | {$data['fName']} | 
                {$data['lName']} |          
                {$data['email']} | 
                {$data['subject']} | 
                {$data['message']} | 
            
        
    
    
    ";
    
    mail("rohit@rohitpai.co.uk", "{$data['fName']} {$data['lName']} filled in the form", $message2, $headers2);
    return $response->withStatus(201);
});
$app->post("/user/login", function (Request $request, Response $response) 
{
    
    global $user;
    
    // get request data
    $data = $request->getParsedBody();
    
    if (empty($data["username"]) || empty($data["password"])) 
    {
        // uh oh user sent empty data
        return $response->withStatus(400);
    }
    if ($user->checkUser($data["username"], $data["password"]))
    {
        // yay, user is logged in
        $_SESSION["token"] = $user->createToken($data["username"]);
        $_SESSION["username"] = $data["username"];
        $response->getBody()->write(json_encode(array("token" => $_SESSION["token"])));
        return $response;
    }
    return $response->withStatus(401);
});
$app->get("/user/isLoggedIn", function (Request $request, Response $response) 
{
    global $user;
    if (empty($_SESSION["token"]) && empty($_SESSION["username"])) 
    {
        // uh oh user not logged in
        return $response->withStatus(401);
    }
    if (empty($_SESSION["token"]))
    {
        // user is logged in but no token was created
        $_SESSION["token"] = $user->createToken($_SESSION["username"]);
        return $response;
    }
    $response->getBody()->write(json_encode(array("token" => $_SESSION["token"])));
    return $response;
    
});
$app->get("/user/checkResetEmail/{email}", function (Request $request, Response $response, array $args)
{
    global $user;
    
    if (empty($args["email"]))
    {
        // uh oh sent empty data
        return $response->withStatus(400);
    }
    
    if ($user->checkEmail($args["email"]))
    {
        // yay email does exist
        $_SESSION["resetToken"] = $user->sendResetEmail($args["email"]);
        $_SESSION["resetEmail"] = $args["email"];
        return $response;
    }
    return $response->withStatus(404);
});
$app->get("/user/resendEmail", function (Request $request, Response $response) 
{
    if (empty($_SESSION["resetToken"]))
    {
        // uh oh not authorized to resend email
        return $response->withStatus(401);
    }
    global $user;
    $_SESSION["resetToken"] = $user->sendResetEmail($_SESSION["resetEmail"]);
    return $response;
});
$app->get("/user/checkResetCode/{code}", function (Request $request, Response $response, array $args)
{
    if (empty($args["code"]))
    {
        // uh oh sent empty data
        return $response->withStatus(400);
    }
    
    if ($_SESSION["resetToken"] === $args["code"])
    {
        // yay, code code matches
        return $response;
    }
    
    return $response->withStatus(401);
});
$app->post("/user/changePassword", function (Request $request, Response $response) 
{
    global $user;
    if (empty($_SESSION["resetToken"]) && empty($_SESSION["resetEmail"]))
    {
        // uh oh not authorized to change password
        return $response->withStatus(401);
    }
    
    $data = $request->getParsedBody();
    if (empty($data["password"]))
    {
        // uh oh sent empty data
        return $response->withStatus(400);
    }
    
    if ($user->changePassword($_SESSION["resetEmail"], $data["password"]))
    {
        // yay, password changed
        unset($_SESSION["resetToken"]);
        unset($_SESSION["resetEmail"]);
        return $response;
    }
    
    return $response->withStatus(500);
});
$app->post("/projectData", function (Request $request, Response $response)
{
    $response->getBody()->write(json_encode(array("test" => "test")));
    return $response;
});
$app->run();