<?php

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

use BapCat\Phi\Phi;
use BapCat\Persist\Drivers\Local\LocalDriver;
use BapCat\Remodel\RemodelConnection;
use Illuminate\Database\Grammar;
use Illuminate\Database\Processors\Processor;
use Illuminate\Database\Query\Grammars\MySqlGrammar;
use Illuminate\Database\Query\Processors\MySqlProcessor;
//use Illuminate\Database\MySqlConnection;
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=remodel', 'remodel', 'remodel');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

$ioc->bind(ConnectionInterface::class, new RemodelConnection($pdo, new MySqlGrammar(), new MySqlProcessor()));

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->required('email', Email::class);
$def->required('password', Password::class);
$def->optional('butt', Text::class)->mapsTo('name');
$def->virtual('a', Text::class, function(User $user): Text {
  return new Text($user->email . ' ' . $user->password);
});
$def->hasMany('posts', Post::class)->foreignKey('creator_id');
$def->timestamps();
$def->scope('corey', function($query) {
  return $query->where('email', 'corey+inserttest@narwhunderful.com');
});

$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);
