<?php
use App\Importer\AccessoryImporter;
use App\Importer\AssetImporter;
use App\Importer\ConsumableImporter;
use App\Importer\LicenseImporter;
use App\Importer\UserImporter;
use App\Models\Accessory;
use App\Models\Asset;
use App\Models\AssetModel;
use App\Models\Category;
use App\Models\CustomField;
use App\Models\Location;
use App\Models\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Notification;

class ImporterTest extends BaseTest
{
    /**
    * @var \UnitTester
    */
    protected $tester;

    public function testDefaultImportAssetWithCustomFields()
    {
        $this->signIn();
        $csv = <<<'EOT'
Full Name,Email,Username,item Name,Category,Model name,Manufacturer,Model Number,Serial,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier,Weight
Bonnie Nelson,bnelson0@cdbaby.com,bnelson0,eget nunc donec quis,quam,massa id,Linkbridge,6377018600094472,27aa8378-b0f4-4289-84a4-405da95c6147,970882174-8,Daping,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2016-04-05,133289.59,Alpha,Undeployable,14,Blogspan,35
EOT;

        $this->initializeCustomFields();
        $this->import(new AssetImporter($csv));

        $this->tester->seeRecord('users', [
            'first_name' => 'Bonnie',
            'last_name' => 'Nelson',
            'email' => 'bnelson0@cdbaby.com',
        ]);
        $this->tester->seeRecord('categories', [
            'name' => 'quam'
        ]);

        $this->tester->seeRecord('models', [
            'name' => 'massa id',
            'model_number' => 6377018600094472
        ]);

        $this->tester->seeRecord('manufacturers', [
            'name' => 'Linkbridge'
        ]);

        $this->tester->seeRecord('locations', [
            'name' => 'Daping'
        ]);

        $this->tester->seeRecord('companies', [
            'name' => 'Alpha'
        ]);

        $this->tester->seeRecord('status_labels', [
            'name' => 'Undeployable'
        ]);

        $this->tester->seeRecord('suppliers', [
            'name' => 'Blogspan'
        ]);

        $this->tester->seeRecord('assets', [
            'name' => 'eget nunc donec quis',
            'serial' => '27aa8378-b0f4-4289-84a4-405da95c6147',
            'asset_tag' => '970882174-8',
            'notes' => "Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",
            'purchase_date' => '2016-04-05 00:00:01',
            'purchase_cost' => 133289.59
,            'warranty_months' => 14,
            '_snipeit_weight_2' => 35
            ]);
    }

    public function testImportCheckoutToLocation()
    {
        $this->signIn();

        // Testing in order:
        // * Asset to user, no checkout type defined (default to user).
        // * Asset to user, explicit user checkout type (Checkout to user)
        // * Asset to location, location does not exist to begin with
        // * Asset to preexisting location.
        $csv = <<<'EOT'
Full Name,Email,Username,Checkout Location,Checkout Type,item Name,Category,Model name,Manufacturer,Model Number,Serial,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier,Weight
Bonnie Nelson,bnelson0@cdbaby.com,bnelson0,,,eget nunc donec quis,quam,massa id,Linkbridge,6377018600094472,27aa8378-b0f4-4289-84a4-405da95c6147,970882174-8,Daping,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2016-04-05,133289.59,Alpha,Undeployable,14,Blogspan,35
Mildred Gibson,mgibson2@wiley.com,mgibson2,,user,morbi quis tortor id,nunc nisl duis,convallis tortor risus,Lajo,374622546776765,2837ab20-8f0d-4935-8a52-226392f2b1b0,710141467-2,Shekou,In congue. Etiam justo. Etiam pretium iaculis justo.,2015-08-09,233.57,Konklab,Lost,,,
,,,Planet Earth,location,dictumst maecenas ut,sem praesent,accumsan felis,Layo,30052522651756,4751495c-cee0-4961-b788-94a545b5643e,998233705-X,Dante Delgado,,2016-04-16,261.79,,Archived,15,Ntag,
,,,Daping,location,viverra diam vitae,semper sapien,dapibus dolor vel,Flashset,3559785746335392,e287bb64-ff4f-434c-88ab-210ad433c77b,927820758-6,Achiaman,,2016-03-05,675.3,,Archived,22,Meevee,
EOT;

        $this->import(new AssetImporter($csv));

        $user = User::where('username', 'bnelson0')->firstOrFail();

        $this->tester->seeRecord('assets', [
            'asset_tag' => '970882174-8',
            'assigned_type' => User::class,
            'assigned_to' => $user->id
        ]);

        $user = User::where('username', 'mgibson2')->firstOrFail();
        $this->tester->seeRecord('assets', [
            'asset_tag' => '710141467-2',
            'assigned_type' => User::class,
            'assigned_to' => $user->id
        ]);

        $location = Location::where('name', 'Planet Earth')->firstOrFail();
        $this->tester->seeRecord('assets', [
            'asset_tag' => '998233705-X',
            'assigned_type' => Location::class,
            'assigned_to' => $location->id
        ]);

        $location = Location::where('name', 'Daping')->firstOrFail();
        $this->tester->seeRecord('assets', [
            'asset_tag' => '927820758-6',
            'assigned_type' => Location::class,
            'assigned_to' => $location->id
        ]);

    }

    public function testUpdateAssetIncludingCustomFields()
    {
        $this->signIn();
        $csv = <<<'EOT'
Name,Email,Username,item Name,Category,Model name,Manufacturer,Model Number,Serial,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier,weight
Bonnie Nelson,bnelson0@cdbaby.com,bnelson0,eget nunc donec quis,quam,massa id,Linkbridge,6377018600094472,27aa8378-b0f4-4289-84a4-405da95c6147,970882174-8,Daping,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2016-04-05,133289.59,Alpha,Undeployable,14,Blogspan,95
EOT;

        $this->initializeCustomFields();
        $this->import(new AssetImporter($csv));

        $updatedCSV = <<<'EOT'
item Name,Category,Model name,Manufacturer,Model Number,Serial,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier
A new name,some other category,Another Model,Linkbridge 32,356,67433477,970882174-8,New Location,I have no notes,2018-04-05,25.59,Another Company,Ready To Go,18,Not Creative
EOT;
        $importer = new AssetImporter($updatedCSV);
        $importer->setUserId(1)
             ->setUpdating(true)
             ->setUsernameFormat('firstname.lastname')
             ->import();

        $this->tester->seeRecord('categories', [
            'name' => 'some other category'
        ]);

        $this->tester->seeRecord('models', [
            'name' => 'Another Model',
            'model_number' => 356
        ]);

        $this->tester->seeRecord('manufacturers', [
            'name' => 'Linkbridge 32'
        ]);

        $this->tester->seeRecord('locations', [
            'name' => 'New Location'
        ]);

        $this->tester->seeRecord('companies', [
            'name' => 'Another Company'
        ]);

        $this->tester->seeRecord('status_labels', [
            'name' => 'Ready To Go'
        ]);

        $this->tester->seeRecord('suppliers', [
            'name' => 'Not Creative'
        ]);

        $this->tester->seeRecord('assets', [
            'name' => 'A new name',
            'serial' => '67433477',
            'asset_tag' => '970882174-8',
            'notes' => "I have no notes",
            'purchase_date' => '2018-04-05 00:00:01',
            'purchase_cost' => 25.59,
            'warranty_months' => 18,
            '_snipeit_weight_2' => 95
        ]);
    }

   public function testAssetModelNumber4359()
    {
        // As per bug #4359
        // 1) Create model with blank model # and custom field.
        // 2 ) Update custom fields with a csv not including model #
        // 3 ) Not updated.  NULL vs. empty issue.
        $this->signIn();
        $csv = <<<'EOT'
Name,Email,Username,item Name,Category,Model name,Manufacturer,Serial,Asset Tag,Location,Notes,Purchase Date,Purchase Cost,Company,Status,Warranty,Supplier
Bonnie Nelson,bnelson0@cdbaby.com,bnelson0,eget nunc donec quis,quam,massa id,Linkbridge,27aa8378-b0f4-4289-84a4-405da95c6147,970882174-8,Daping,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2016-04-05,133289.59,Alpha,Undeployable,14,Blogspan
EOT;

        // Need to do this manually...
            $customField = factory(App\Models\CustomField::class)->create(['name' => 'Weight']);
            $customFieldSet = factory(App\Models\CustomFieldset::class)->create(['name' => 'Default']);
            $customFieldSet->fields()->attach($customField, [
                'required' => false,
                'order' => 'asc']);

            factory(App\Models\Category::class)->states('asset-laptop-category')->create([
                'name' => 'quam'
            ]);

            factory(App\Models\Manufacturer::class)->states('apple')->create([
                'name' => 'Linkbridge'
            ]);


            $am = factory(App\Models\AssetModel::class)->create([
                'name' => 'massa id',
                'fieldset_id' => $customFieldSet->id,
                'category_id' => 1,
                'manufacturer_id' => 1,
                'model_number' => null
            ]);

        $this->import(new AssetImporter($csv));
        $updatedCSV = <<<'EOT'
Serial,Asset Tag,weight
67433477,970882174-8,115
EOT;
        $importer = new AssetImporter($updatedCSV);
        $importer->setUserId(1)
             ->setUpdating(true)
             ->setUsernameFormat('firstname.lastname')
             ->import();

        $this->tester->seeRecord('assets', [
            'asset_tag' => '970882174-8',
            '_snipeit_weight_2' => 115
        ]);
    }

    public function initializeCustomFields()
    {
            $customField = factory(App\Models\CustomField::class)->create(['name' => 'Weight']);
            $customFieldSet = factory(App\Models\CustomFieldset::class)->create(['name' => 'Default']);
            $customFieldSet->fields()->attach($customField, [
                'required' => false,
                'order' => 'asc']);

            $am = factory(App\Models\AssetModel::class)->create([
                'name' => 'massa id',
                'fieldset_id' => $customFieldSet->id
            ]);
    }

    public function testCustomMappingImport()
    {
        $this->signIn();
        $csv = <<<'EOT'
Full Name,Email,Username,object name,Cat,Model name,Manufacturer,Model Number,Serial,Asset,Loc,Some Notes,Purchase Date,Purchase Cost,comp,Status,Warranty,Supplier
Bonnie Nelson,bnelson0@cdbaby.com,bnelson0,eget nunc donec quis,quam,massa id,Linkbridge,6377018600094472,27aa8378-b0f4-4289-84a4-405da95c6147,970882174-8,Daping,"Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",2016-04-05,133289.59,Alpha,Undeployable,14,Blogspan
EOT;

        $customFieldMap = [
            'asset_tag' => 'Asset',
            'category' => 'Cat',
            'company' => 'comp',
            'item_name' => 'object name',
            'expiration_date' => 'expiration date',
            'location' => 'loc',
            'notes' => 'Some Notes',
            'asset_model' => "model name",
        ];

        $this->import(new AssetImporter($csv), $customFieldMap);
        // Did we create a user?
        $this->tester->seeRecord('users', [
            'first_name' => 'Bonnie',
            'last_name' => 'Nelson',
            'email' => 'bnelson0@cdbaby.com',
        ]);
        // Grab the user record for use in asserting assigned_to
        $createdUser = $this->tester->grabRecord('users', [
            'first_name' => 'Bonnie',
            'last_name' => 'Nelson',
            'email' => 'bnelson0@cdbaby.com',
        ]);

        $this->tester->seeRecord('categories', [
            'name' => 'quam'
        ]);

        $this->tester->seeRecord('models', [
            'name' => 'massa id',
            'model_number' => 6377018600094472
        ]);

        $this->tester->seeRecord('manufacturers', [
            'name' => 'Linkbridge'
        ]);

        $this->tester->seeRecord('locations', [
            'name' => 'Daping'
        ]);

        $this->tester->seeRecord('companies', [
            'name' => 'Alpha'
        ]);

        $this->tester->seeRecord('status_labels', [
            'name' => 'Undeployable'
        ]);

        $this->tester->seeRecord('suppliers', [
            'name' => 'Blogspan'
        ]);

        $this->tester->seeRecord('assets', [
            'name' => 'eget nunc donec quis',
            'serial' => '27aa8378-b0f4-4289-84a4-405da95c6147',
            'asset_tag' => '970882174-8',
            'notes' => "Curabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est.",
            'purchase_date' => '2016-04-05 00:00:01',
            'purchase_cost' => 133289.59,
            'warranty_months' => 14,
            'assigned_to' => $createdUser['id'],
            'assigned_type' => User::class
        ]);
    }

    public function testDefaultAccessoryImport()
    {
        $csv = <<<'EOT'
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
Walter Carter,09/01/2006,,metus. Vivamus,Macromedia,J935H60W,Customers,False,278
EOT;
        $this->import(new AccessoryImporter($csv));
        $this->tester->seeRecord('accessories', [
            'name' => 'Walter Carter',
            'purchase_date' => '2006-09-01 00:00:01',
            'order_number' => 'J935H60W',
            'requestable' => 0,
            'qty' => 278
        ]);

        $this->tester->seeRecord('locations', [
            'name' => 'metus. Vivamus'
        ]);

        $this->tester->seeRecord('companies', [
            'name' => 'Macromedia'
        ]);

        $this->tester->seeRecord('categories', [
            'name' => 'Customers'
        ]);
    }

    public function testDefaultAccessoryUpdate()
    {
        $csv = <<<'EOT'
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
Walter Carter,09/01/2006,,metus. Vivamus,Macromedia,J935H60W,Customers,False,278
EOT;
        $this->import(new AccessoryImporter($csv));
        $this->tester->seeNumRecords(1, 'accessories');


        $updatedCSV = <<<'EOT'
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
Walter Carter,09/01/2015,350,metus. Vivamus,Macromedia,35GGH,Customers,True,12
EOT;
        $importer = new AccessoryImporter($updatedCSV);
        $importer->setUserId(1)
             ->setUpdating(true)
             ->import();
        // At this point we should still only have one record.
        $this->tester->seeNumRecords(1, 'accessories');
        // But instead these.
        $this->tester->seeRecord('accessories', [
            'name' => 'Walter Carter',
            'purchase_date' => '2015-09-01 00:00:01',
            'order_number' => '35GGH',
            'requestable' => 1,
            'qty' => 12
        ]);
    }

    public function testCustomAccessoryImport()
    {
        $csv = <<<'EOT'
Name,Pur Date,Cost,Loc,Comp,Order Num,Cat,Request,Quan
Walter Carter,09/01/2006,,metus. Vivamus,Macromedia,J935H60W,Customers,False,278
EOT;

        $customFieldMap = [
            'category' => 'Cat',
            'company' => 'Comp',
            'item_name' => 'Name',
            'location' => 'Loc',
            'purchase_date' => 'Pur Date',
            'purchase_cost' => "Cost",
            'order_number' => 'Order Num',
            'requestable' => 'Request',
            'quantity' => 'Quan'
        ];
        $this->import(new AccessoryImporter($csv), $customFieldMap);
        // dd($this->tester->grabRecord('accessories'));
        $this->tester->seeRecord('accessories', [
            'name' => 'Walter Carter',
            'purchase_date' => '2006-09-01 00:00:01',
            'order_number' => 'J935H60W',
            'requestable' => 0,
            'qty' => 278
        ]);

        $this->tester->seeRecord('locations', [
            'name' => 'metus. Vivamus'
        ]);

        $this->tester->seeRecord('companies', [
            'name' => 'Macromedia'
        ]);

        $this->tester->seeRecord('categories', [
            'name' => 'Customers'
        ]);
    }

    public function testDefaultConsumableImport()
    {
        $csv = <<<'EOT'
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity,Item Number,Model Number
eget,01/03/2011,$85.91,mauris blandit mattis.,Lycos,T295T06V,Triamterene/Hydrochlorothiazide,No,322,3305,30123
EOT;
        $this->import(new ConsumableImporter($csv));
        $this->tester->seeRecord('consumables', [
            'name' => 'eget',
            'purchase_date' => '2011-01-03 00:00:01',
            'purchase_cost' => 85.91,
            'order_number' => 'T295T06V',
            'requestable' => 0,
            'qty' => 322,
            'item_no' => 3305,
            'model_number' => 30123
        ]);

        $this->tester->seeRecord('locations', [
            'name' => 'mauris blandit mattis.'
        ]);

        $this->tester->seeRecord('companies', [
            'name' => 'Lycos'
        ]);

        $this->tester->seeRecord('categories', [
            'name' => 'Triamterene/Hydrochlorothiazide'
        ]);
    }

    public function testDefaultConsumableUpdate()
    {
        $csv = <<<'EOT'
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
eget,01/03/2011,85.91,mauris blandit mattis.,Lycos,T295T06V,Triamterene/Hydrochlorothiazide,No,322
EOT;
        $this->import(new ConsumableImporter($csv));
        $this->tester->seeNumRecords(1, 'consumables');


        $updatedCSV = <<<'EOT'
Item Name,Purchase Date,Purchase Cost,Location,Company,Order Number,Category,Requestable,Quantity
eget,12/05/2016,35.45,mauris blandit mattis.,Lycos,3666FF,New Cat,Yes,15
EOT;
        $importer = new ConsumableImporter($updatedCSV);
        $importer->setUserId(1)
             ->setUpdating(true)
             ->import();
        // At this point we should still only have one record.
        $this->tester->seeNumRecords(1, 'consumables');
        // But instead these.
        $this->tester->seeRecord('consumables', [
            'name' => 'eget',
            'purchase_date' => '2016-12-05 00:00:01',
            'purchase_cost' => 35.45,
            'order_number' => '3666FF',
            'requestable' => 1,
            'qty' => 15
        ]);
    }

    public function testCustomConsumableImport()
    {
        $csv = <<<'EOT'
Name,pur Date,Pur Cost,Loc,Comp,Order Num,Kat,Request,Quan
eget,01/03/2011,85.91,mauris blandit mattis.,Lycos,T295T06V,Triamterene/Hydrochlorothiazide,No,322
EOT;

        $customFieldMap = [
            'category' => 'Kat',
            'company' => 'Comp',
            'item_name' => 'Name',
            'location' => 'Loc',
            'purchase_date' => 'Pur date',
            'purchase_cost' => "Pur Cost",
            'order_number' => 'Order Num',
            'requestable' => 'Request',
            'quantity' => 'Quan'
        ];
        $this->import(new ConsumableImporter($csv), $customFieldMap);
        $this->tester->seeRecord('consumables', [
            'name' => 'eget',
            'purchase_date' => '2011-01-03 00:00:01',
            'purchase_cost' => 85.91,
            'order_number' => 'T295T06V',
            'requestable' => 0,
            'qty' => 322
        ]);

        $this->tester->seeRecord('locations', [
            'name' => 'mauris blandit mattis.'
        ]);

        $this->tester->seeRecord('companies', [
            'name' => 'Lycos'
        ]);

        $this->tester->seeRecord('categories', [
            'name' => 'Triamterene/Hydrochlorothiazide'
        ]);
    }

    public function testDefaultLicenseImport()
    {
        $this->signIn();
        $csv = <<<'EOT'
Full Name,Email,Username,Item name,serial,manufacturer,purchase date,purchase cost,purchase order,order number,Licensed To Name,Licensed to Email,expiration date,maintained,reassignable,seats,company,supplier,category,notes,asset tag
Helen Anderson,cspencer0@privacy.gov.au,cspencer0,Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",07/13/2012,$79.66,53008,386436062-5,Cynthia Spencer,cspencer0@gov.uk,01/27/2016,false,no,80,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Graphics Software,Sed ante. Vivamus tortor. Duis mattis egestas metus.,test 1
EOT;

        // Force create an asset to match the checkout
        $testAsset = $this->createValidAsset(['asset_tag' => 'test 1']);
        $this->import(new LicenseImporter($csv));
        // dd($this->tester->grabRecord('licenses'));

        // Did we create a user?
        $this->tester->seeRecord('users', [
            'first_name' => 'Helen',
            'last_name' => 'Anderson',
            'email' => 'cspencer0@privacy.gov.au',
        ]);
        // Grab the user record for use in asserting assigned_to
        $createdUser = $this->tester->grabRecord('users', [
            'first_name' => 'Helen',
            'last_name' => 'Anderson',
            'email' => 'cspencer0@privacy.gov.au',
        ]);
        $this->tester->seeRecord('licenses', [
            'name' => 'Argentum Malachite Athletes Foot Relief',
            'purchase_date' => '2012-07-13 00:00:01',
            'seats' => 80,
            'license_email' => 'cspencer0@gov.uk',
            'order_number' => '386436062-5',
            'license_name' => 'Cynthia Spencer',
            'expiration_date' => '2016-01-27',
            'maintained' => 0,
            'notes' => 'Sed ante. Vivamus tortor. Duis mattis egestas metus.',
            'purchase_cost' => 79.66,
            'purchase_order' => "53008",
            'reassignable' => 0,
            'serial' => '1aa5b0eb-79c5-40b2-8943-5472a6893c3c',
        ]);
        $this->tester->seeRecord('manufacturers', [
            'name' => 'Beer, Leannon and Lubowitz'
        ]);

        $this->tester->seeRecord('suppliers', [
            'name' => "Hegmann, Mohr and Cremin",
        ]);

        $this->tester->seeRecord('companies', [
            'name' => 'Haag, Schmidt and Farrell'
        ]);

        $this->tester->seeRecord('categories', [
            'name' => 'Graphics Software'
        ]);

        $this->tester->seeNumRecords(80, 'license_seats');
        $this->tester->seeRecord('license_seats', [
            'assigned_to' => $createdUser['id'],
            'license_id' => \App\Models\License::where('serial','1aa5b0eb-79c5-40b2-8943-5472a6893c3c')->first()->id,
            'asset_id' => $testAsset->id
        ]);
    }

    public function testDefaultLicenseUpdate()
    {
        $csv = <<<'EOT'
Name,Email,Username,Item name,serial,manufacturer,purchase date,purchase cost,purchase order,order number,Licensed To Name,Licensed to Email,expiration date,maintained,reassignable,seats,company,supplier,category,notes
Helen Anderson,cspencer0@privacy.gov.au,cspencer0,Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",07/13/2012,$79.66,53008,386436062-5,Cynthia Spencer,cspencer0@gov.uk,01/27/2016,false,no,80,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Graphics Software,Sed ante. Vivamus tortor. Duis mattis egestas metus.
EOT;
        $this->import(new LicenseImporter($csv));
        $this->tester->seeNumRecords(1, 'licenses');


        $updatedCSV = <<<'EOT'
Item name,serial,manufacturer,purchase date,purchase cost,purchase order,order number,Licensed To Name,Licensed to Email,expiration date,maintained,reassignable,seats,company,supplier,category,notes
Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",05/15/2019,$1865.34,63 ar,18334,A Legend,Legendary@gov.uk,04/27/2016,yes,true,64,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Graphics Software,Sed ante. Vivamus tortor. Duis mattis egestas metus.
EOT;
        $importer = new LicenseImporter($updatedCSV);
        $importer->setUserId(1)
             ->setUpdating(true)
             ->import();
        // At this point we should still only have one record.
        $this->tester->seeNumRecords(1, 'licenses');
        // But instead these.

        \Log::debug($this->tester->grabRecord('licenses'));
        $this->tester->seeRecord('licenses', [
            'name' => 'Argentum Malachite Athletes Foot Relief',
            'purchase_date' => '2019-05-15 00:00:01',
            'seats' => 64,
            'license_email' => 'Legendary@gov.uk',
            'order_number' => '18334',
            'license_name' => 'A Legend',
            'expiration_date' => '2016-04-27',
            'maintained' => 1,
            'notes' => 'Sed ante. Vivamus tortor. Duis mattis egestas metus.',
            'purchase_cost' => 1865.34,
            'purchase_order' => "63 ar",
            'reassignable' => 1,
            'serial' => '1aa5b0eb-79c5-40b2-8943-5472a6893c3c',
        ]);
        // License seats are soft deleted
        $this->tester->seeNumRecords(64, 'license_seats', ['deleted_at' => null]);
    }

    public function testCustomLicenseImport()
    {
        $csv = <<<'EOT'
Name,Email,Username,Object name,serial num,manuf,pur date,pur cost,purc order,order num,Licensed To,Licensed Email,expire date,maint,reass,seat,comp,supplier,category,note
Helen Anderson,cspencer0@privacy.gov.au,cspencer0,Argentum Malachite Athletes Foot Relief,1aa5b0eb-79c5-40b2-8943-5472a6893c3c,"Beer, Leannon and Lubowitz",07/13/2012,$79.66,53008,386436062-5,Cynthia Spencer,cspencer0@gov.uk,01/27/2016,false,no,80,"Haag, Schmidt and Farrell","Hegmann, Mohr and Cremin",Custom Graphics Software,Sed ante. Vivamus tortor. Duis mattis egestas metus.
EOT;

        $customFieldMap = [
            'company' => 'Comp',
            'expiration_date' => 'expire date',
            'item_name' => 'Object Name',
            'license_email' => 'licensed email',
            'license_name' => 'licensed to',
            'maintained' => 'maint',
            'manufacturer' => 'manuf',
            'notes' => 'note',
            'order_number' => 'Order Num',
            'purchase_cost' => "Pur Cost",
            'purchase_date' => 'Pur date',
            'purchase_order' => "Purc Order",
            'quantity' => 'Quan',
            'reassignable' => 'reass',
            'requestable' => 'Request',
            'seats' => 'seat',
            'serial' => 'serial num',
            'category' => 'category',
        ];
        $this->import(new LicenseImporter($csv), $customFieldMap);
        $this->tester->seeRecord('licenses', [
            'name' => 'Argentum Malachite Athletes Foot Relief',
            'purchase_date' => '2012-07-13 00:00:01',
            'seats' => 80,
            'license_email' => 'cspencer0@gov.uk',
            'order_number' => '386436062-5',
            'license_name' => 'Cynthia Spencer',
            'expiration_date' => '2016-01-27',
            'maintained' => 0,
            'notes' => 'Sed ante. Vivamus tortor. Duis mattis egestas metus.',
            'purchase_cost' => 79.66,
            'purchase_order' => "53008",
            'reassignable' => 0,
            'serial' => '1aa5b0eb-79c5-40b2-8943-5472a6893c3c',
        ]);

        $this->tester->seeRecord('manufacturers', [
            'name' => 'Beer, Leannon and Lubowitz'
        ]);

        $this->tester->seeRecord('suppliers', [
            'name' => "Hegmann, Mohr and Cremin",
        ]);

        $this->tester->seeRecord('companies', [
            'name' => 'Haag, Schmidt and Farrell'
        ]);

        $this->tester->seeNumRecords(80, 'license_seats');
    }


    public function testDefaultUserImport()
    {
        Notification::fake();
        $this->signIn();
        $csv = <<<'EOT'
First Name,Last Name,email,Username,Location,Phone Number,Job Title,Employee Number,Company,Department,activated
Blanche,O'Collopy,bocollopy0@livejournal.com,bocollopy0,Hinapalanan,63-(199)661-2186,Clinical Specialist,7080919053,Morar-Ward,Management,1
Jessie,Primo,,jprimo1,Korenovsk,7-(885)578-0266,Paralegal,6284292031,Jast-Stiedemann,1

EOT;
        $user_importer = new UserImporter($csv);
        $user_importer->sendWelcome();
        $this->import($user_importer);

        $this->tester->seeRecord('users', [
            'first_name' => 'Blanche',
            'last_name' => "O'Collopy",
            'email' => 'bocollopy0@livejournal.com',
            'username' => 'bocollopy0',
            'phone' => '63-(199)661-2186',
            'jobtitle' => 'Clinical Specialist',
            'employee_num' => '7080919053'
        ]);

        $this->tester->seeRecord('companies', [
            'name' => 'Morar-Ward'
        ]);

        $this->tester->seeRecord('departments', [
            'name' => 'Management'
        ]);

        Notification::assertSentTo(User::find(2), \App\Notifications\WelcomeNotification::class);
        Notification::assertNotSentTo(User::find(3), \App\Notifications\WelcomeNotification::class);
    }
    private function import($importer, $mappings = null)
    {
        if ($mappings) {
            $importer->setFieldMappings($mappings);
        }
        $importer->setUserId(1)
             ->setUpdating(false)
             ->setUsernameFormat('firstname.lastname')
             ->import();
    }
}