<?php

namespace App\Imports;

use App\Subscriber;
use App\SubscriberContactFileImport;
use App\Tools\SendinBlueEmailService;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\URL;
use Illuminate\Support\Str;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithValidation;


class SendinBlueContactImport implements ToCollection, WithHeadingRow, WithValidation
{
    private $sendinblue;

    private $subscriberFile;

    public function __construct($subscriberFile)
    {
        $this->subscriberFile = $subscriberFile;
        $this->sendinblue = new SendinBlueEmailService();
    }


    public function collection(Collection $rows)
    {
        $contacts = array();
        $tempContacts = array();
        $timestamp = Carbon::now();


//        if (count($contacts) > 0){

            // Save file locally in storage path
            $savedFile = $this->saveFile($this->subscriberFile);
            $fileUrl = $savedFile['fileUrl'] ?? null;
            $contactFileImport = $savedFile['contactFileImport'] ?? null;

            // If file saved successfully and was able to generate fileUrl
            if ($savedFile && $fileUrl && $contactFileImport):

                // Get various data array
                foreach ($rows as $row){
                    $contactData = ['email_address' => strtolower($row['email_address']), 'created_at' => $timestamp, 'updated_at' => $timestamp, 'user_mailing_list_id' => $this->list()->id, 'status' => 'subscribed', 'sendinblue_status' => 'successful', 'subscriber_contact_file_import_id' => $contactFileImport->id];
                    array_push($contacts, $contactData);

                    $tempContactData = ['email_address' => strtolower($row['email_address']), 'created_at' => $timestamp, 'updated_at' => $timestamp, 'user_mailing_list_id' => $this->list()->id, 'status' => 'temporal', 'sendinblue_status' => 'pending', 'subscriber_contact_file_import_id' => $contactFileImport->id];
                    array_push($tempContacts, $tempContactData);
                }



                $contactFileImport->update([
                    'file_contacts' => json_encode($contacts),
                ]);

                // bulk delete existing contacts
                $this->deleteSubscriberTemporarily($this->list()->id);

                // Save contacts temporarily
                $this->local_publish($tempContacts);

            else:
                // Error Encountered saving file locally
                return back()->with('error','Error Encountered Saving Uploaded File');
            endif;
//        }

//        else{
//            // No Contacts found in file
//            return back()->with('error','No Contact Found In Uploaded File');
//        }

        return true;
    }

    public function rules(): array
    {
        return [
            'email_address' => 'required|email'
        ];
    }


    public function sendinblue_publish($fileUrl)
    {
        $endpoint = 'import-contacts';
        $sendinblue =  $this->sendinblue;

        $formData = [
            'listId' => $this->list()->api_mail_list_id,
            'fileUrl' => $fileUrl
        ];

        return $sendinblue->postApiCall($endpoint, $formData);
    }


    public function local_publish($params)
    {
        Subscriber::query()->insert($params);
    }


    public function saveFile($subscribeFile): array
    {
        // Generate a unique filename for the uploaded file and get file extension
        $file_extension = $subscribeFile->getClientOriginalExtension();
        $filename = uniqid() . '.' . $file_extension;

        // Store the file with the desired filename and MIME type
        $path = Storage::putFileAs('public/SendinblueContactImports', $subscribeFile, $filename, ['mime' => 'text/csv', 'encoding' => 'UTF-8']);

        // Generate url to imported file by concatenating the domain with the path to the file
        $fileUrl = $this->getCurrentDomain() . Storage::url($path);

        // Save data for subscriber contact file import details
        $contactFileImport = $this->storeSubscriberContactFileImport($path, $file_extension, $fileUrl, $filename);

        return [
            'fileUrl' => $fileUrl,
            'contactFileImport' => $contactFileImport
        ];
    }


    public function getCurrentDomain(): string
    {
        $domainEnv = env('APP_URL');

        $url = URL::current();
        $parsedUrl = parse_url($url);
        $domain = $parsedUrl['host'] ?? '';

        return $domainEnv ?? $domain;
    }


    public function storeSubscriberContactFileImport($file_path, $file_extension, $file_url, $filename)
    {
        return SubscriberContactFileImport::query()->create([
            'user_mailing_list_id' => $this->list()->id,
            'file_path' => $file_path,
            'file_extension' => $file_extension,
            'file_url' => $file_url,
            'file_name' => $filename
        ]);
    }

    public function deleteSubscriberTemporarily($listId){

        $subscribers = Subscriber::query()->where('user_mailing_list_id','=',$listId);

        // Unsubscribe before bulk Deleting
        $subscribers->update(['status' => 'unsubscribed']);

        // Bulk deleting
        $subscribers->delete();
    }

    public function list()
    {
        return session()->get('list');
    }
}
