#!/bin/env php
<?php

require __DIR__ . '/vendor/autoload.php';

use BapCat\Phi\Phi;
use BapCat\Persist\Drivers\Local\LocalDriver;
use Jenssegers\Mongodb\Connection;
use Illuminate\Database\ConnectionInterface;

$ioc = Phi::instance();

// Grab filesystem directories
$persist = new LocalDriver(__DIR__);
$cache   = $persist->getDirectory('/cache');

//$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');
//$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$ioc->bind(ConnectionInterface::class, function() {
  $connection = new Connection([
    'driver'   => 'mongodb',
    'host'     => 'localhost',
    'port'     => 27017,
    'database' => 'remodel',
    'username' => '',
    'password' => '',
    'options' => [
      'db' => 'admin' // sets the authentication database required by mongo 3
    ]
  ]);
  
  $connection->useDefaultQueryGrammar();
  
  return $connection;
});

use BapCat\Values\Email;
use BapCat\Values\Password;
use BapCat\Values\Text;

use BapCat\Remodel\Registry;
use BapCat\Remodel\EntityDefinition;
use BapCat\CoolThing\User;
use BapCat\CoolThing\UserId;
use BapCat\CoolThing\UserGateway;
use BapCat\CoolThing\UserRepository;
use BapCat\CoolThing\Post;
use BapCat\CoolThing\PostGateway;
use BapCat\CoolThing\PostRepository;
use BapCat\CoolThing\Device;
use BapCat\CoolThing\DeviceGateway;
use BapCat\CoolThing\DeviceRepository;
use BapCat\CoolThing\UserDevice;
use BapCat\CoolThing\UserDeviceGateway;
use BapCat\CoolThing\UserDeviceRepository;

$registry = $ioc->make(Registry::class, [$cache]);

$def = new EntityDefinition(User::class);
$def->id(UserId::class)->mapsTo('_id');
$def->required('email', Email::class);
$def->required('password', Password::class);
$def->optional('name', Text::class);
$def->hasMany('posts', Post::class)->foreignKey('creator_id');
$def->timestamps();

$registry->register($def);

$def = new EntityDefinition(Post::class);
$def->required('text', Text::class);
$def->belongsTo('creator', User::class)->localKey('creator_id');
$def->timestamps();

$registry->register($def);

$def = new EntityDefinition(Device::class);
$def->required('mac', Text::class);
$def->timestamps();

$registry->register($def);

$def = new EntityDefinition(UserDevice::class);
$def->associates('user_devices', 'user', User::class, 'device', Device::class);

$registry->register($def);

$ioc->singleton(UserGateway::class, UserGateway::class);
$ioc->singleton(UserRepository::class, UserRepository::class);

$ioc->singleton(PostGateway::class, PostGateway::class);
$ioc->singleton(PostRepository::class, PostRepository::class);

$ioc->singleton(DeviceGateway::class, DeviceGateway::class);
$ioc->singleton(DeviceRepository::class, DeviceRepository::class);

$ioc->singleton(UserDeviceGateway::class, UserDeviceGateway::class);
$ioc->singleton(UserDeviceRepository::class, UserDeviceRepository::class);

$gate = $ioc->make(UserGateway::class);
$repo = $ioc->make(UserRepository::class);

var_dump($gate->query()->get());
