<?php
/**
 * Copyright (c) 2020/2
 * Created by Federico Papetti
 */

namespace FourWords\AppManager\IocClient\Providers;

use FourWords\AppManager\Catalog\Importer\CatalogImporter;
use FourWords\AppManager\Catalog\Importer\ImageImporter;
use FourWords\AppManager\Catalog\Importer\Pim\PimCatalogImporter;
use FourWords\AppManager\Catalog\Importer\Pim\PimFeatureImporter;
use FourWords\AppManager\Catalog\Importer\Pim\PimImageImporter;
use FourWords\AppManager\Catalog\Importer\Pim\PimResourceImporter;
use FourWords\AppManager\Catalog\Importer\ResourceImporter;
use FourWords\AppManager\Director\DatabaseManager;
use FourWords\AppManager\Ioc\Bonjour\IocBonjour;
use FourWords\AppManager\Ioc\Contracts\Bonjour;
use FourWords\AppManager\Ioc\Geo\GeocoderServiceInterface;
use FourWords\AppManager\Ioc\Geo\HereGeocoder;
use FourWords\AppManager\Ioc\Jobs\ImportIocUsers;
use FourWords\AppManager\Ioc\Providers\ClientProvider;
use FourWords\AppManager\Ioc\Providers\IocServiceProvider;
use FourWords\AppManager\Ioc\Resource\ResourceRepository;
use FourWords\AppManager\IocClient\Databases\Generic\Generic;
use FourWords\AppManager\IocClient\Databases\Specific\Specific;
use FourWords\AppManager\IocClient\Databases\Warehouse\Warehouse;
use FourWords\AppManager\IocClient\Importer\Pim\PaggPimFeatureImporter;
use FourWords\AppManager\Orders\Interfaces\OrderServiceInterface;
use FourWords\AppManager\Orders\Services\MockOrderService;
use FourWords\AppManager\SqliteGen\SqliteGenerator;

class IocClientServiceProvider extends ClientProvider
{

    public const PACKAGE_DEPENDENCIES = [];
    public const PACKAGE_DEV_DEPENDENCIES = [];

    public function register() {

        // Tramite binding sostituisco l'archiver utilizzato nei database con GZIP
//        $this->app->bind(ArchiverInterface::class,function($app) {
//            return new GZipArchiver();
//        });

        $this->app->bind(Bonjour::class,IocBonjour::class);
        $this->app->bind(OrderServiceInterface::class,MockOrderService::class);

        // Importazione catalogo, immagini, risorse da pim
        $this->app->bind(CatalogImporter::class,PimCatalogImporter::class);
        $this->app->bind(ImageImporter::class,PimImageImporter::class);
        $this->app->bind(ResourceImporter::class,PimResourceImporter::class);

        $this->app->bind(GeocoderServiceInterface::class, function ($app, $params) {
            return new HereGeocoder(...$params);
        });

        $this->app->bind(PimFeatureImporter::class,PaggPimFeatureImporter::class);
        $this->scheduleTasks();

    }

//    public function bindResourcesPaths() {

//        $this->app->singleton(ResourceRepository::class, function($app, $params) {
//            $resourceRepository = new ResourceRepository();
//            $resourceRepository->addPath('storage/folder/with/documents', ['doc']);
//            return $resourceRepository;
//        });
//    }

    public function scheduleTasks() {

        $this->app->booted(function() {

            $this->app->bind(ImportIocUsers::class,function($app, $params) {
                return new \FourWords\AppManager\IocClient\Jobs\ImportIocUsers(...$params);
            });

            if (app()->runningInConsole())
                IocServiceProvider::scheduleTasks();

        });

    }

    public function boot() {

        set_time_limit(36000);
        error_reporting(E_ERROR);

        /*
        |--------------------------------------------------------------------------
        | Aggiungo la connessione b2b al modulo sqlitegen
        |
        | Richiamabile con DatabaseManager::getConnection('nome')->table('abcde')....
        |--------------------------------------------------------------------------*/

//        $b2bConnection = [
//            'driver' => 'mysql',
//            'host' => '164.132.167.232',
//            'port' => '3306',
//            'database' => 'b2b',
//            'username' => 'root',
//            'password' => 'qXgHtmXEztKF',
//            'unix_socket' => '',
//            'charset' => 'utf8mb4',
//            'collation' => 'utf8mb4_unicode_ci',
//            'prefix' => '',
//            'prefix_indexes' => true,
//            'strict' => false,
//            'engine' => null,
//            'options' => []
//        ];
//
//        DatabaseManager::addConnection($b2bConnection,'datasource'); // Alias della connessione standard utilizzata da sqlitegen (SQG_AUTOIMPORT_CONNECTION)
//        DatabaseManager::addConnection($b2bConnection,'b2b');

        /*
        |--------------------------------------------------------------------------
        | Aggiungo la connessione dell'AS400. Riutilizzabile di default nel package Dataextractor
        |
        | Utilizzabile con new DataExtractor()->execute...
        |--------------------------------------------------------------------------*/
        DatabaseManager::addConnection([
            'ip' => config('ioc.as.ip'),
            'user' => config('ioc.as.user'),
            'pwd' => config('ioc.as.password'),
            'lib' => '*LIBL',
            'driver' => 'com.ibm.as400.access.AS400JDBCDriver',
            'connection-warning' => 'false',
            'jdbc' => 'jdbc:as400://'.config('ioc.as.ip').';libraries=*LIBL;naming=system;prompt=false;errors=full'
        ],'datasource');

        /*
        |--------------------------------------------------------------------------
        | Inclusione database modulo Sqlitegen
        |--------------------------------------------------------------------------*/
        /** @var SqliteGenerator $sqliteGenerator */
        $sqliteGenerator = app()->make('sqlitegen');
        $sqliteGenerator->load(Generic::class, Specific::class, Warehouse::class);

        /*
        |--------------------------------------------------------------------------
        | Includo migrazioni, rotte, views
        |--------------------------------------------------------------------------*/
        $this->loadMigrationsFrom(__DIR__ . '/../../database/migrations');
        $this->loadRoutesFrom(__DIR__ . '/../../routes/routes.php');
        $this->loadViewsFrom(__DIR__ . '/../../resources/views', 'ioc');
        $this->overrideCustomViews(__DIR__ . '/../../resources/views');

        $this->registerConsoleCommands();
        $this->registerLivewireComponents();

        $this->addResourcePaths();

    }

    protected function addResourcePaths() {
        /** @var ResourceRepository $resourceRepository */
        $resourceRepository = $this->app->make(ResourceRepository::class);
        $resourceRepository->addType('img', [config('ioc.ps.icmImgCategoriesDir'), config('ioc.ps.icmImgGalleriesDir'), config('ioc.ps.icmImgProductsDir'), config('ioc.ps.icmImgCombinationsDir')]);
        $resourceRepository->addPath(config('ioc.ps.downloadDir'), ['doc', 'vid']);
    }

    protected function registerConsoleCommands()
    {
//        if ($this->app->runningInConsole()) {
//            $this->commands(CustomCommand::class);
//        }
    }

    protected function registerLivewireComponents()
    {
//        Livewire::component('prodotti-venduti-stats', DemoProdottiVendutiStats::class);
    }

}
