<?php

namespace App\Imports;

use App\AuditTrail;
use App\Tools\SmsTools;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithChunkReading;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithValidation;

class GroupImport implements  ToCollection,WithHeadingRow,WithChunkReading
{
    /**
     * @param $user
     * @param $group
     * @param $addedcontact
     */

    public function __construct($user, $group,$addedcontact)
    {
        $this->user =  $user;
        $this->group =  $group;
        $this->addedcontact =  $addedcontact;
    }

    public function collection(Collection $collection)
    {
        $user = Auth::user();
        $to_insert = [];
        $audit_trail =[];

        foreach ($collection->toArray() as $row) {

            $values = array_values($row);


            if(!empty($values[0]) || !empty($values[2])) {
                $inputs = [
                    'phone_number' => SmsTools::format_gh_number($values[0]),
                    'name' => isset($values[1]) ? $values[1]: null,
                    'email' => isset($values[2]) ? $values[2]: null,
                    'user_id' => $user->id
                ];

                //check if phone number already exist
//                $existing = array_search($inputs['phone_number'], array_column($to_insert, 'phone_number'));

//                $existing = $this->group->contacts()
//                    ->where('phone_number', $inputs['phone_number'])
//                    ->first();

                $existing = DB::table('contacts')
                    ->where('phone_number', $inputs['phone_number'])
                    ->where('contact_group_id', $this->group->id)
                    ->first();

                $var1 = $inputs['phone_number'];
                $var2 = $this->group->id;

                $existing2 = array_filter($to_insert, function($val) use($var1, $var2){
                    return ($val['phone_number']==$var1 and $val['contact_group_id']==$var2);
                });

//                ->whereNull('deleted_at')


                if (!empty($existing) || !empty($existing2)) {
                    //skip existing contact
                    continue;
                }

                //create new contact
                array_push($to_insert, [
                    'phone_number' => $inputs['phone_number'],
                    'name' => $inputs['name'],
                    'email' => $inputs['email'],
                    'user_id' => $inputs['user_id'],
                    'contact_group_id' => $this->group->id
                ]);

//                dd($this->group->contacts()->create($inputs));
                $this->addedcontact++;



//                update audit_trail
                array_push($audit_trail, [
                    'user_id' => $user->id,
                    'username' => $user->username,
                    'date' => Carbon::now()->toDateTimeString(),
                    'activity' => $user->name.' uploaded '. $this->addedcontact.' contact(s)'
                ]);

//                AuditTrail::create([
//                    'user_id' => $user->id,
//                    'username' => $user->username,
//                    'date' => Carbon::now()->toDateTimeString(),
//                    'activity' => $user->name.' uploaded '. $this->addedcontact.' contact(s)'
//                ]);
            }
        }

        $this->group->contacts()->insert($to_insert);
        AuditTrail::query()->insert($audit_trail);


    }




    public function chunkSize(): int
    {
        return 1000;
    }

}
