<?php

require("openid.php");
require("rb.php");

R::setup("sqlite:socialize.db");

class Socialize {
  private $info     = false;
  private $success  = false;
  private $warning  = false;
  private $error    = false;
  private $visitor  = false;
  private $owner    = "";

  public function __construct($owner) {
    $this->owner = $owner;

    if (isset($_GET['openid_url']) and $_GET['action'] == "login")
      $this->login();
    if (isset($_GET['action']) and $_GET['action'] == "logout")
      $this->logout();
    if (isset($_POST['action']) and $_POST['action'] == "addfriend")
      $this->addfriend();

    if (isset($_SESSION['visitor']))
      $this->visitor = $_SESSION['visitor'];
  }

  public function loginbox() {
    if (! $this->visitor) {
      print "<form method=\"get\" action=\"index.php\" id=\"login\">\n";
      print "<input type=\"hidden\" name=\"action\" value=\"login\" />\n";
      print "<input type=\"text\" name=\"openid_url\" value=\"your openid\" size=\"30\" accesskey=\"l\" onclick=\"this.value='';\" />\n";
      print "<input type=\"submit\" name=\"submit\" value=\"Login\" />\n";
      print "</form>\n";
    }
  }

  public function logoutbox() {
    if ($this->visitor)
      print "<a href=\"?action=logout\">logout</a>\n";
  }

  private function logout() {
    $_SESSION['visitor'] = false;
    $this->success = "Logout successful";
  }

  public function messages() {
    if ($this->error)
      print "<div class=\"message\" id=\"error\">" . $this->error . "</div>\n";
    if ($this->success)
      print "<div class=\"message\" id=\"success\">" . $this->success . "</div>\n";
  }

  public function friends() {
    print "<ul class=\"friends\">\n";
    $friends = R::find("friend");
    foreach($friends as $f) {
      printf("<li><a href=\"%s\">%s</a></li>\n", $f->identity, $f->fullname);
    }
    print "</ul>\n";
  }

  public function log() {
    if ($this->owner()) {
      print "<ul class=\"log\">\n";
      $friends = R::find("visitor");
      foreach($friends as $f) {
        printf("<li><a href=\"%s\">%s</a> Last seen: %s</li>\n", $f->identity, $f->fullname, $f->lastSeen);
      }
      print "</ul>\n";
    }
  }

  public function addfriendbox() {
    if ($this->owner()) {
      print "<form method=\"post\" action=\"index.php\" id=\"addfriend\">\n";
      print "<input type=\"hidden\" name=\"action\" value=\"addfriend\" />\n";
      print "<input type=\"text\" name=\"openid\" size=\"30\" accesskey=\"a\" />\n";
      print "<input type=\"submit\" name=\"submit\" value=\"Add as friend\" />\n";
      print "</form>\n";
    }
  }

  public function visitor() {
    if ($this->visitor)
      return $this->visitor;
    else
      return false;
  }

  public function owner() {
    if ($this->visitor and $this->visitor['identity'] == $this->owner) {
      return $this->visitor;
    }
    else {
      return false;
    }
  }

  public function friend() {
    if ($this->owner() or $this->visitor and $this->visitor['identity'] == $this->owner)
      return $this->visitor;
    else
      return false;
  }

  private function addfriend() {
      $identity = $_POST['openid'];
      $friend = R::findOne("friend", "identity = ?", array($identity));
      if ($friend) {
        $this->error = "This identity is already a friend";
      }
      else {
        $friend = R::dispense("friend");
        $friend->identity = $identity;
        $dateTime = new DateTime("now");
        $friend->since = $dateTime->format("Y-m-d H:i:s");

        $visitor = R::findOne("visitor", "identity = ?", array($identity));
        if ($visitor) {
          $friend->fullname = $visitor->fullname;
          $friend->nickname = $visitor->nickname;
          $friend->email    = $visitor->email;
        }

        R::store($friend);
        $this->success = "Friend successfully added";
      }
      
  }

  private function login() {
    $scheme = 'http';
    if (isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] == 'on') {
      $scheme .= 's';
    }
    $realm = sprintf("%s://%s:%s%s/",
                         $scheme, $_SERVER['SERVER_NAME'],
                         $_SERVER['SERVER_PORT'],
                         dirname($_SERVER['PHP_SELF']));

    try {
      $openid = new LightOpenID;
      $openid->realm = $realm;
      $openid->required = array('namePerson');
      $openid->optional = array('namePerson/friendly', 'contact/email');

      if(!$openid->mode) {
        if(isset($_GET['openid_url'])) {
          $openid->identity = $_GET['openid_url'];
          header('Location: ' . $openid->authUrl());
        }
      } elseif ($openid->mode == 'cancel') {
        $this->error = 'User has canceled authentication!';
      } else {
        if ($openid->validate()) {
          $attributes = $openid->getAttributes();

          $this->visitor = array('identity' => htmlentities($openid->identity),
                                 'fullname' =>
                                 htmlentities($attributes['namePerson']),
                                 );
          if (isset($attributes['namePerson/friendly'])) {
            $this->visitor['nickname'] = htmlentities($attributes['namePerson/friendly']);
          }
          if (isset($attributes['contact/email'])) {
            $this->visitor['email'] = htmlentities($attributes['contact/email']);
          }

          $visitor = R::findOne("visitor", "identity = ?", array($openid->identity));
          if (! $visitor) {
            $visitor = R::dispense("visitor");
          }

          $visitor->import($this->visitor);
          $dateTime = new DateTime("now");
          $visitor->lastSeen = $dateTime->format("Y-m-d H:i:s");

          R::store($visitor);

          $this->success = "Login successful";
          $_SESSION['visitor'] = $this->visitor;
        }
        else {
          $this->error = "Login failed";
        }
      }
    } catch(ErrorException $e) {
      $this->error = $e->getMessage();
    }
  }
}

?>
