<?php

namespace App\Http\Controllers;

use App\Company;
use App\CompanyEmail;
use App\DataTables\ClientEmailDataTable;
use App\DataTables\EMAIL\MailingListDataTable;
use App\DataTables\SingleClientEmailDataTable;
use App\DataTables\SubscriberDataTable;
use App\Imports\SendinBlueContactImport;
use App\Imports\SubscriberImport;
use App\MailFolder;
use App\Notifications\ChimpNotification;
use App\Subscriber;
use App\SubscriberContactFileImport;
use App\Traits\ChimpReport;
use App\Traits\ChimpTrait;
use App\Traits\ClientCampaignEmail;
use App\Traits\Subscription;
use App\User;
use App\UserMailingList;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Notification;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Str;
use Maatwebsite\Excel\Facades\Excel;
use App\Tools\SendinBlueEmailService;
use League\Csv\Writer;
use PhpOffice\PhpSpreadsheet\IOFactory;

class ClientEmailController extends Controller
{

    use ChimpTrait, ClientCampaignEmail, ChimpReport,Subscription;

    private $sendinblue;

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

    public function originalCsvFile($file_storage_path, $contactEmail, $requestEmail, $subFileImport): bool
    {

        if (file_exists($file_storage_path)) {
            $file = fopen($file_storage_path, 'r');

            // Read the first row (header) and store it in an array
            $header = fgetcsv($file);

            // Initialize an empty array to store the data
            $data = array();

            // Read each row of data and store it in the array
            while (($row = fgetcsv($file)) !== false) {
                $data[] = $row;
            }

            // Close the file
            fclose($file);

            $rowIndexUpdated = null;
            // Search for a cell in the data array based on the value of its index
            $targetIndexValue = $contactEmail;
            foreach ($data as $rowIndex => $row) {
                foreach ($row as $colIndex => $cellValue) {
                    if ($colIndex === 0 && $cellValue === $targetIndexValue) {
                        // Get the rowIndex
                        $rowIndexUpdated = $rowIndex;
                        // Update the cell
                        $data[$rowIndex][$colIndex] = $requestEmail;
                    }
                }
            }


            // Open the CSV file in write mode
            $file = fopen($file_storage_path, 'w');

            // Write the header row to the file
            fputcsv($file, $header);

            // Write each row of data to the file
            foreach ($data as $row) {
                fputcsv($file, $row);
            }

            // Close the file
            fclose($file);



            // update file data
            if (isset($subFileImport->file_contacts) && !empty($subFileImport->file_contacts)){
                $contactList = json_decode($subFileImport->file_contacts, true);

                if(isset($contactList[$rowIndexUpdated])){
                    if (isset($contactList[$rowIndexUpdated]['email_address'])){
                        // update data from file_contacts column
                        $contactList[$rowIndexUpdated]['email_address'] = $requestEmail;
                    }
                }

                $encodedContactList = json_encode($contactList, true);


                $subFileImport->update([
                    'file_contacts' => $encodedContactList
                ]);


//                dd($subFileImport, $encodedContactList);
//                dd($contactList, $contactList[$rowIndexUpdated], $contactList[$rowIndexUpdated]['email_address'], $subFileImport->file_contacts, $rowIndexUpdated);
            }



            return true;
        }
        else{
            return false;
        }
    }

    public function originalCsvFileOld($file_storage_path, $contactEmail, $requestEmail){

        if (file_exists($file_storage_path)) {
            $file = fopen($file_storage_path, 'r');

            $data = [];
            $headers = null;
            while (($row = fgetcsv($file)) !== false) {
                if (!$headers) {
                    $headers = $row;
                    continue;
                }
                $data[] = array_combine($headers, $row);
            }

            $emailToSearch = $contactEmail;

            // Find the row with the matching email address
//            $rowIndex = null;
            foreach ($data as $index => $row) {
//                dd($index, $row);
                if ($row['email_address'] == $emailToSearch) {
                    $rowIndex = $index;
                    break;
                }
            }

//            dd($rowIndex, $emailToSearch);
//            if ($rowIndex !== null) {
                // Update the email address
//                $data[$rowIndex]['email_address'] = $requestEmail;
                $data[0]['email_address'] = $requestEmail;

                // Save the updated data to the CSV file
                $file = fopen($file_storage_path, 'w');
                fputcsv($file, $headers);
                foreach ($data as $row) {
                    fputcsv($file, $row);
                }
                fclose($file);
//            }
//            fclose($file);
        }
    }

    public function updateContactCsvFile($contactEmail, $userMailListId, $requestEmail, $subscriberFileImportId): bool
    {
        $file_path = SubscriberContactFileImport::query()->where([['user_mailing_list_id','=',$userMailListId],['id','=', $subscriberFileImportId]])->first();

        $file_storage_path = $file_path ? storage_path('app/' . $file_path->file_path) : null;

//        dd($file_storage_path, $file_path, $subscriberFileImportId);
        // Update Original Csv File
        return $this->originalCsvFile($file_storage_path, $contactEmail, $requestEmail, $file_path);


    }

    public function deleteRowFromOriginalCsvFile($contactEmail, $userMailListId, $subscriberFileImportId): bool
    {
        $file_path = SubscriberContactFileImport::query()->where([['user_mailing_list_id','=',$userMailListId],['id','=', $subscriberFileImportId]])->first();

        $file_storage_path = $file_path ? storage_path('app/' . $file_path->file_path) : null;

        if (file_exists($file_storage_path)) {
            $file = fopen($file_storage_path, 'r');

            // Read the first row (header) and store it in an array
            $header = fgetcsv($file);

            // Initialize an empty array to store the data
            $data = array();

            // Read each row of data and store it in the array
            while (($row = fgetcsv($file)) !== false) {
                $data[] = $row;
            }

            // Close the file
            fclose($file);

            $rowIndexRemoved = null;
            // Search for a cell in the data array based on the value of its index
            $targetIndexValue = $contactEmail;
            foreach ($data as $rowIndex => $row) {
                foreach ($row as $colIndex => $cellValue) {
                    if ($colIndex === 0 && $cellValue === $targetIndexValue) {
                        // Get the rowIndex
                        $rowIndexRemoved = $rowIndex;
                        // Remove the row
                        array_splice($data, $rowIndex, 1);
                    }
                }
            }


            // Open the CSV file in write mode
            $file = fopen($file_storage_path, 'w');

            // Write the header row to the file
            fputcsv($file, $header);

            // Write each row of data to the file
            foreach ($data as $row) {
                fputcsv($file, $row);
            }

            // Close the file
            fclose($file);

            $subFileImport = $file_path;
            // update file data
            if (isset($subFileImport->file_contacts) && !empty($subFileImport->file_contacts)){
                $contactList = json_decode($subFileImport->file_contacts, true);

                if(isset($contactList[$rowIndexRemoved])){
                    if (isset($contactList[$rowIndexRemoved]['email_address'])){
                        // update data from file_contacts column
                        array_splice($contactList, $rowIndexRemoved, 1);
                    }
                }

                $encodedContactList = json_encode($contactList, true);

                $subFileImport->update([
                    'file_contacts' => $encodedContactList
                ]);

            }

            return true;
        }
        else{
            return false;
        }
    }

    public function deleteRowFromOriginalCsvFileOld($contactEmail, $userMailListId){
        $file_path = SubscriberContactFileImport::query()->where('user_mailing_list_id','=',$userMailListId)->first();

        $file_storage_path = $file_path ? storage_path('app/' . $file_path->file_path) : null;

        if (file_exists($file_storage_path)) {
            $file = fopen($file_storage_path, 'r');

            $data = [];
            $headers = null;
            while (($row = fgetcsv($file)) !== false) {
                if (!$headers) {
                    $headers = $row;
                    continue;
                }
                $data[] = array_combine($headers, $row);
            }

            $emailToSearch = $contactEmail;

            // Find the row with the matching email address
            $rowIndex = null;
            foreach ($data as $index => $row) {
                if ($row['email_address'] == $emailToSearch) {
                    $rowIndex = $index;
                    break;
                }
            }

            if ($rowIndex !== null) {
                // Remove the row
                array_splice($data, $rowIndex, 1);

                // Save the updated data to the CSV file
                $file = fopen($file_storage_path, 'w');
                fputcsv($file, $headers);
                foreach ($data as $row) {
                    fputcsv($file, $row);
                }
                fclose($file);
            }

//            fclose($file);
        }
    }

    public function getAllFolders()
    {
        // Get current user mail folder data
        $currentUser = \auth()->user();
        $userMailFolders = $currentUser->mailFolders()->pluck('api_mail_folder_id')->toArray();

        // Get data from API
        $preMailFoldersContent = $this->sendinblue->getApiCall('get-folders')['folders'] ?? [];
        $mailContentCollection = collect($preMailFoldersContent);

        return $mailContentCollection->whereIn('id',$userMailFolders)->toArray();
    }


    public function mailFolder()
    {
        // Get current user mail folder data
        $currentUser = \auth()->user();
        $userMailFolders = $currentUser->mailFolders()->pluck('api_mail_folder_id')->toArray();

        // get data from API
        $sendinblue = (new SendinBlueEmailService());
        $allMailFolders = $sendinblue->getApiCall('get-folders');

        $preMailFoldersContent = $allMailFolders['folders'] ?? [];
        $mailFoldersContentCount = $allMailFolders['count'] ?? null;
        $mailContentCollection = collect($preMailFoldersContent);

        $filteredMailContent = $mailContentCollection->whereIn('id',$userMailFolders)->toArray();

        $mailFoldersContent = $filteredMailContent;

        return view('sendinblue.mail_folder', compact( 'mailFoldersContent'));
    }


    public function createFolder(Request $request){

        $sendinblue = (new SendinBlueEmailService());
        try {
            // Validation
            $validator = Validator::make($request->all(),[
                'folderName' => 'required|min:3',
            ]);

            if ($validator->fails()){
                return response()->json([
                    'code' => 401,
                    'status' => 'error',
                    'message' => $validator->errors()
                ]);
            }

            DB::beginTransaction();
            // Insert data into local database
            $currentUser = \auth()->user();
            $data = ['name' => $request->input('folderName')];
            $mailFolder = $currentUser->mailFolders()->create($data);
            DB::commit();

            // Push data to sendinblue api
            $formData = [
                'folderName' => $request->input('folderName'),
            ];
            $endpoint = "create-folder";
            $response = $sendinblue->postApiCall($endpoint, $formData);

            if(isset($response['id'])){
                // Updating local data record with id from sendinblue api
                $mailFolder->update(['api_mail_folder_id' => $response['id']]);

                $code = 200;
                $status = 'success';
                $message = 'successfully created Mail Folder';
                $sendinblue->appLog("Successfully Created Mail Folder");
            }
            else{
                $code = 500;
                $status = 'failed';
                $message = $response['message'];
                $sendinblue->appLog("Error Encountered Creating Mail Folder");
            }


        }
        catch (\Exception $exception){
            DB::rollBack();
            $code = 500;
            $status = 'failed';
            $message = 'failed';

            $sendinblue->appLog("Failed Updating Mail Folder | Response: " . json_encode($exception->getMessage()));
        }

        return response()->json([
            'code' => $code,
            'status' => $status,
            'message' => $message
        ]);

    }


    public function mailFolderUpdate(Request $request, $id){

        $sendinblue = (new SendinBlueEmailService());
        try {
            // Validation
            $validator = Validator::make($request->all(),[
                'folderName' => 'required|min:3',
            ]);

            if ($validator->fails()){
                return response()->json([
                    'code' => 401,
                    'status' => 'error',
                    'message' => $validator->errors()
                ]);
            }

            DB::beginTransaction();
            // update data in local database
            $currentUser = \auth()->user();
            $data = ['name' => $request->input('folderName')];
            $currentUser->mailFolders()->where('api_mail_folder_id','=',$id)->update($data);
            DB::commit();

            $formData = [
               'newFolderName' => $request->input('folderName'),
            ];
            $endpoint = "update-folder/$id";
            $response = $sendinblue->postApiCall($endpoint, $formData);


            if($response['code'] == 200){
                $code = 200;
                $status = 'success';
                $message = 'successfully updated Mail Folder';
            }
            else{
                $code = 500;
                $status = 'failed';
                $message = $response['message'];
            }


            $sendinblue->appLog("Successfully Updated Mail Folder | Folder Id: {$id} | Response: ");
        }
        catch (\Exception $exception){
            $code = 500;
            $status = 'failed';
            $message = 'failed';

            $sendinblue->appLog("Failed Updating Mail Folder | Folder Id: {$id} | Response: " . json_encode($exception->getMessage()));
        }

        return response()->json([
           'code' => $code,
           'status' => $status,
           'message' => $message
        ]);

    }


    public function mailFolderDelete(Request $request, $id){
        $sendinblue = (new SendinBlueEmailService());
        try {
            DB::beginTransaction();
            // delete data from local database
            $currentUser = \auth()->user();
            $currentUser->mailFolders()->where('api_mail_folder_id','=',$id)->delete();
            DB::commit();

            $endpoint = "delete-folder/$id";
            $response = $sendinblue->deleteApiCall($endpoint);

            if($response['code'] == 200){
                $code = 200;
                $status = 'success';
                $message = 'successfully deleted Mail Folder';
            }
            else{
                $code = 500;
                $status = 'failed';
                $message = $response['message'];
            }


            $sendinblue->appLog("Successfully Deleted Mail Folder | Folder Id: {$id} | Response: ");
        }
        catch (\Exception $exception){
            $code = 500;
            $status = 'failed';
            $message = 'failed on deleting Mail Folder';

            $sendinblue->appLog("Failed Deleting Mail Folder | Folder Id: {$id} | Response: " . json_encode($exception->getMessage()));
        }

        return response()->json([
            'code' => $code,
            'status' => $status,
            'message' => $message
        ]);
    }


    public function list(MailingListDataTable $mails, Request $request)
    {
        $keyword = $request->input('keyword') ?? '';
        return $mails->render('sendinblue.lists.index',compact('keyword'));
    }


    public function list_create(Request $request)
    {
        $user = Auth::user();
        $current_audience = $user->mailing_list->count();
        $allFolders = $this->getAllFolders();

        if($request->isMethod('post'))
        {

            $request->validate(
                [
                    'name'                 => 'required',
                    'from_name'            => 'required',
                    'from_email'           => 'required|email',
                    'language'             => 'required',
                    'permission_reminder'  => 'required',
                    'company'              => 'required',
                    'address1'             => 'required',
                    'address2'             => 'required',
                    'city'                 => 'required',
                    'state'                => 'required',
                    'country'              => 'required',
                    'zip'                  => 'required',
                    'phone'                => 'required',
                    'folder'               => 'required',
                ]
            );

            try {
                $data = $request->except('_token');
                $data['api_folder_id'] = $request->input('folder');

                DB::beginTransaction();
                $list = $user->mailing_list()->create($data);
                DB::commit();

                // ====================== Push data to sendinblue api ======================//
                    $formData = [
                        'listName' => $request->input('name'),
                        'folderId' => $request->input('folder'),
                    ];
                    $endpoint = "create-list";
                    $response = $this->sendinblue->postApiCall($endpoint, $formData);

                    if(isset($response['id'])) {
                        // Updating local data record with id from sendinblue api
                        $list->update(['api_mail_list_id' => $response['id'], 'status' => 'published']);
                        $this->sendinblue->appLog("Successful in Creating Mail List");
                    }
                    else{
                        $this->sendinblue->appLog("Error Encountered while creating Mail List");
                        return back()->with('error',json_encode($response['message']));
                    }

                // ====================== Push data to sendinblue api ======================//

        } catch (\Exception $exception) {
                DB::rollBack();
                $this->sendinblue->appLog("Failed Updating Mail List | Response: " . json_encode($exception->getMessage()));

                return back()->with('error','Error Encountered while creating Mail List');
            }

            $data = (object)$data;
            $content = [
                'to'      => 'support@npontu.com',
                'name'    =>  'NOC',
                'subject' =>  'NEW SENDINBLUE MAIL AUDIENCE/LIST' ,
                'body'    =>  "The Client , {$user->username} has created a new mail  audience/list on sendinblue <br>
with the name {$data->name}" ,
            ];

            $this->sendEmail($content);


            return redirect()->route('email.contacts.setup')->with('success','Mail list created  and published successfully');
//            return redirect()->route('email.contacts.setup')->with('success','Mail list created successfully kindly review and publish the mail audience to activate it');
        }




        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly


        if(isset($limit) && $limit->no_audience <= $current_audience):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = "You have reached your mail audience limit of $limit->no_audience !!";
            return redirect($route)->withErrors($flash);
        endif;

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;


        return view('sendinblue.lists.create',['address'=>$user->campaign_address, 'allFolders' => $allFolders]);
    }


    public function list_edit(Request $request,$id)
    {
        $user = Auth::user();
        $current_audience = $user->mailing_list->count();
        $allFolders = $this->getAllFolders();

        $list = $user->mailing_list()->find($id);

        if($request->isMethod('post'))
        {
            $request->validate(
                [
                    'name'                 => 'required',
                    'from_name'            => 'required',
                    'from_email'           => 'required|email',
                    'language'             => 'required',
                    'permission_reminder'  => 'required',
                    'company'              => 'required',
                    'address1'             => 'required',
                    'address2'             => 'required',
                    'city'                 => 'required',
                    'state'                => 'required',
                    'country'              => 'required',
                    'zip'                  => 'required',
                    'phone'                => 'required',
                    'folder'               => 'nullable',
                ]
            );

            $data = $request->except('_token');

            if($list->status != 'published') {
                $data['status'] = 'pending';
            }


            DB::beginTransaction();

            try {
                // ====================== Push data to sendinblue api ======================//
                $formData = [
                    'listName' => $request->input('name'),
                    'listId' => $list->api_mail_list_id,
                ];

                $endpoint = "update-list-name";
                $response = $this->sendinblue->postApiCall($endpoint, $formData);

                if(isset($response['status']) && ($response['status'] ?? '') == 'success') {
                    // Updating local data record with id from sendinblue api
                    $data['status'] = 'published';
                    $list->update($data);
                    $this->sendinblue->appLog("Successful in Updating Mail List");
                }
                else{
                    $this->sendinblue->appLog("Error Encountered while Updating Mail List");
                    return back()->with('error',json_encode($response['message']));
                }

                // ====================== Push data to sendinblue api ======================//

            } catch (\Exception $exception) {
                DB::rollBack();
                $this->sendinblue->appLog("Failed Updating Mail List | Response: " . json_encode($exception->getMessage()));

                return back()->with('error','Error Encountered while Updating Mail List');
            }

            DB::commit();


            return redirect()->route('email.contacts.setup')->with('success','Mail list updated successfully');
        }

        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;

        return view('sendinblue.lists.edit',compact('list','allFolders'));
    }


    public function list_delete(UserMailingList $list)
    {
        $user = Auth::user();
        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;

        try {

            $endpoint = "delete-list/{$list->api_mail_list_id}";
            $response = $this->sendinblue->deleteApiCall($endpoint);

            $flash =(object) ['status'=>'','flash'=>''];

            if(isset($response['status']) && ($response['status'] ?? '') == 'success') {
                $list->delete();
                $flash->status ='success';
                $flash->flash ='List successfully deleted !!';
            }
            else{
                $flash->status ='errors';
                $flash->flash = $response['message'];
            }

            $this->sendinblue->appLog("Successful in Deleted Mail List");
            return redirect()->back()->with($flash->status,$flash->flash);

        } catch (\Exception $e) {
            $this->sendinblue->appLog("Failed Deleting Mail List | Response: " . json_encode($e->getMessage()));
            return redirect()->back()->withErrors($e->getMessage());
        }
    }


    public function list_publish(Request $request,$id)
    {
        $user = Auth::user();
        $list = $user->mailing_list()->find($id);

        if($request->isMethod('post'))
        {

            DB::beginTransaction();

            $status = $this->mail_chimp_list($list);

            if(isset($status['id'])){
                $list->update([
                    'list_id'=>$status['id'],
                    'status'=>'published'
                ]);

                $flash =(object) ['status'=>'success','flash'=>'Mail list published successfully kindly click on the yellow icon to add your email contacts to the list'];
            }
            else
            {
                $list->update(['status'=>'failed']);
                $flash =(object) ['status'=>'errors','flash'=>'Publishing failed !! review your data and try again '];
            }


            DB::commit();

            return redirect()->route('email.contacts.setup')->with($flash->status,$flash->flash);
        }

        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;

        return view('chimp.publish',compact('list'));
    }


    public function list_assign(SubscriberDataTable $subscriber,Request $request,UserMailingList $list)
    {
        session(['list'=>$list]);
        return $subscriber->render('sendinblue.contacts.assign',compact('list'));
    }


    public function list_assign_member(Request $request,UserMailingList $list)
    {
        $user = Auth::user();
        $subscriber_count = $user->subscriberCount();
        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly


        if ($request->isMethod('post'))
        {
            $request->validate([
                'subscriber_import' => 'required|mimes:csv,txt|max:51200'
            ]);
            if($request->hasFile('subscriber_import')):

                $subscriberFile = $request->file('subscriber_import');
                $file_count = Excel::toArray(new SendinBlueContactImport($subscriberFile),$request->file('subscriber_import'));

                $total_count = $subscriber_count + count($file_count[0]);

                if(isset($limit) && $limit->no_contacts <= $total_count)
                    return redirect()->route('email.contacts.setup.assign',$list->id)->withErrors(
                        "You have reached your email contacts limit of $limit->no_contacts  !!"
                    );


                DB::beginTransaction();
                Excel::import(new SendinBlueContactImport($subscriberFile),$request->file('subscriber_import'),null);
                DB::commit();

            else:
                return redirect()->back()->withErrors("NOTHING IN IMPORTED !!!");
            endif;

            return redirect()->route('email.contacts.setup.assign',$list->id)->with('success','Contacts successfully added you can now create a campaign');

        }
        session(['list'=>$list]);


        if(isset($limit) && $limit->no_contacts <= $subscriber_count):
            $route = $user->under_reseller() ? url()->previous():  route('email.contacts.setup.assign',$list->id);
            return redirect($route)->withErrors(
                "You have reached your email contacts limit of $limit->no_contacts  !!"
            );
        endif;

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;


        return view('sendinblue.contacts.add_sub',compact('list'));
    }


    public function list_assign_member_edit(Request $request,Subscriber $subscriber)
    {
        $user = Auth::user();

        if ($request->isMethod('post'))
        {
            $data = $request->validate([
                'email_address'=>'required|email'
            ]);

            DB::beginTransaction();

            try {
                // ====================== updating contact data locally  ======================//

                $this->sendinblue->appLog("Successful in Updating Mail Contact");

                $contactEmail = $subscriber->email_address;
                $userMailListId = $subscriber->user_mailing_list_id;
                $subscriberFileImportId = $subscriber->subscriber_contact_file_import_id;
                $requestEmail = $request->input('email_address');

                $results = $this->updateContactCsvFile($contactEmail, $userMailListId, $requestEmail, $subscriberFileImportId);

                if ($results){
                    $subscriber->update($data);
                }
                else{
                    return back()->with('error','Error Encountered while Updating Mail Contact');
                }



            } catch (\Exception $exception) {
                DB::rollBack();
                $this->sendinblue->appLog("Failed Updating Mail Contact | Response: " . json_encode($exception->getMessage()));

                return back()->with('error','Error Encountered while Updating Mail Contact');
            }

            DB::commit();

            return redirect()->route('email.contacts.setup.assign',$subscriber->user_mailing_list->id)->with('success','Contact Successfully Updated!!!');
        }

        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;


        return view('sendinblue.contacts.add_sub_edit',compact('subscriber'));
    }

    public function list_assign_member_editCurrentOld(Request $request,Subscriber $subscriber)
    {
        $user = Auth::user();

        if ($request->isMethod('post'))
        {
            $data = $request->validate([
                'email_address'=>'required|email'
            ]);

            DB::beginTransaction();

            try {
                // ====================== Push data to sendinblue api ======================//
                $formData = [
                    'email' => $request->input('email_address'),
                ];

                $subscriberEmail = $subscriber->email_address;
                $endpoint = "update-contact/{$subscriberEmail}";
                $response = $this->sendinblue->postApiCall($endpoint, $formData);

                if(isset($response['status']) && ($response['status'] ?? '') == 'success') {
                    // Updating local data record with id from sendinblue api
                    $subscriber->update($data);

                    $this->sendinblue->appLog("Successful in Updating Mail Contact");
                }
                else{
                    $this->sendinblue->appLog("Error Encountered while Updating Mail Contact");
                    return back()->with('error',json_encode($response['message']));
                }

                // ====================== Push data to sendinblue api ======================//

            } catch (\Exception $exception) {
                DB::rollBack();
                $this->sendinblue->appLog("Failed Updating Mail Contact | Response: " . json_encode($exception->getMessage()));

                return back()->with('error','Error Encountered while Updating Mail Contact');
            }

            DB::commit();

            return redirect()->route('email.contacts.setup.assign',$subscriber->user_mailing_list->id)->with('success','Contact Successfully Updated!!!');
        }

        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;


        return view('sendinblue.contacts.add_sub_edit',compact('subscriber'));
    }


    public function list_assign_member_delete(Request $request,Subscriber $subscriber)
    {
        $user = Auth::user();
        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;

        try {
            $contactEmail = $subscriber->email_address;
            $userMailListId = $subscriber->user_mailing_list_id;
            $subscriberFileImportId = $subscriber->subscriber_contact_file_import_id;
            $results = $this->deleteRowFromOriginalCsvFile($contactEmail, $userMailListId,$subscriberFileImportId);

            if ($results){
                // Unsubscribe before Deleting
                $subscriber->update(['status' => 'unsubscribed']);

                $subscriber->delete();

                $this->sendinblue->appLog("Successful in Deleting Mail Contact");
            }
            else{
                return back()->with('error','Error Encountered while Updating Mail Contact');
            }


        } catch (\Exception $e) {
            $this->sendinblue->appLog("Failed Deleting Mail Contact | Response: " . json_encode($e->getMessage()));
            return redirect()->back()->withErrors($e->getMessage());
        }

        return redirect()->route('email.contacts.setup.assign',$subscriber->user_mailing_list->id)->with('success','Contact Successfully Deleted!!!');
    }


    public function list_assign_member_deleteCurrentOld(Request $request,Subscriber $subscriber)
    {
        $user = Auth::user();
        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;

        try {
            $subscriberEmail = $subscriber->email_address;
            $endpoint = "delete-contact/{$subscriberEmail}";
            $response = $this->sendinblue->deleteApiCall($endpoint);


            if(isset($response['status']) && ($response['status'] ?? '') == 'success') {
                // Unsubscribe before Deleting
                $subscriber->update(['status' => 'unsubscribed']);

                $subscriber->delete();
                $this->sendinblue->appLog("Successful in Deleting Mail Contact");
            }
            else{
                $this->sendinblue->appLog("Error Encountered while Deleting Mail Contact");
                return back()->with('error',json_encode($response['message']));

            }


        } catch (\Exception $e) {
            $this->sendinblue->appLog("Failed Deleting Mail Contact | Response: " . json_encode($e->getMessage()));
            return redirect()->back()->withErrors($e->getMessage());
        }

        return redirect()->route('email.contacts.setup.assign',$subscriber->user_mailing_list->id)->with('success','Contact Successfully Deleted!!!');
    }



    public function index(ClientEmailDataTable $email)
    {
        return $email->render('admin.company.email.index');
    }

    public function single_client_mail(SingleClientEmailDataTable $single,$id)
    {
        session(['this_user_id'=>$id]);
        return $single->render('admin.company.email.single',[
            'name'=> User::query()->find($id)
        ]);
    }

    public function approve($id)
    {
        $email = CompanyEmail::query()->find($id);

        if(empty($email))
            return redirect()->back()->withErrors('Email Not Found');

        $company = Company::query()->find($email->company_id);

        if(empty($company))
            return redirect()->back()->withErrors('Company Not Found');


        $data['status'] = 1;
        $data['comment'] = null;
        $email->update($data);

        $msg = "Hello {$company->name},
Your Email ID, {$email->source_mail}
has been approved
Thank you.";

        $head = "Email Registration Approval";
        $subject = "Deywuro";
        $from    = "sms@deywuro.com";
        $to      = "{$company->users->email}";

        $content['head'] =  $head;
        $content['subject'] = $subject;
        $content['from'] = $from;
        $content['body'] = "Your Email ID, {$email->source_mail} has been successfully approved";
        $content['to'] = $to;
        $content['name'] = $company->users->username;


        $this->sendSms($msg,$company->users->phone_number);
        $this->sendEmail($content);


        return redirect()->back()->with('success','Email Successfully Approved');

    }

    public function reject(Request $request,$id)
    {
        $email = CompanyEmail::query()->find($id);

        if(empty($email))
            return redirect()->back()->withErrors('Email Not Found');

        $company = Company::query()->find($email->company_id);

        if(empty($company))
            return redirect()->back()->withErrors('Company Not Found');


        if(empty($request->input('comment')))
            return redirect()->back()->withErrors('Comment Is Required');


        $data['status'] = 2;
        $data['comment'] = $request->input('comment');
        $email->update($data);

        $msg = "Hello {$company->name},
Your Email ID, {$email->source_mail}
has been rejected because {$request->input('comment')}
Thank you.";

        $head = "Email Registration Rejection";
        $subject = "Deywuro";
        $from    = "sms@deywuro.com";
        $to      = "{$company->users->email}";

        $content['head'] =  $head;
        $content['subject'] = $subject;
        $content['from'] = $from;
        $content['body'] = "Your Email ID, {$email->source_mail} has been rejected <br> <b>Reason:</b> {$request->input('comment')}";
        $content['to'] = $to;
        $content['name'] = $company->users->username;


        $this->sendSms($msg,$company->users->phone_number);
        $this->sendEmail($content);


        return redirect()->back()->with('success','Email Successfully Approved');

    }

    public function list_assignOld(SubscriberDataTable $subscriber,Request $request,UserMailingList $list)
    {
        session(['list'=>$list]);
        return $subscriber->render('chimp.assign',compact('list'));
    }

    public function list_assign_memberOld(Request $request,UserMailingList $list)
    {
        $user = Auth::user();
        $subscriber_count = $user->subscriberCount();
        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly


        if ($request->isMethod('post'))
        {
            if($request->hasFile('subscriber_import')):

                $file_count  =  Excel::toArray(new SubscriberImport(),$request->file('subscriber_import'),null);
                $total_count = $subscriber_count + count($file_count[0]);


                if(isset($limit) && $limit->no_contacts <= $total_count)
                    return redirect()->route('email.contacts.setup.assign',$list->id)->withErrors(
                        "You have reached your email contacts limit of $limit->no_contacts  !!"
                    );


                DB::beginTransaction();
                Excel::import(new SubscriberImport(),$request->file('subscriber_import'),null);
                DB::commit();


            else:
                return redirect()->back()->withErrors("NOTHING IN IMPORTED !!!");
            endif;

            return redirect()->route('email.contacts.setup.assign',$list->id)->with('success','Contacts successfully added you can now create a template and campaign');

        }
        session(['list'=>$list]);


        if(isset($limit) && $limit->no_contacts <= $subscriber_count):
            $route = $user->under_reseller() ? url()->previous():  route('email.contacts.setup.assign',$list->id);
            return redirect($route)->withErrors(
                "You have reached your email contacts limit of $limit->no_contacts  !!"
            );
        endif;

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;




        return view('chimp.add_sub',compact('list'));
    }

    public function list_assign_member_editOld(Request $request,Subscriber $subscriber)
    {
        $user = Auth::user();

        if ($request->isMethod('post'))
        {
            $data = $request->validate([
                'email_address'=>'required|email'
            ]);
            $subscriber->update($data);
            $this->chimp_list_member_update($subscriber,'patch');

            return redirect()->route('email.contacts.setup.assign',$subscriber->user_mailing_list->id)->with('success','Contact Successfully Updated!!!');
        }

        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;


        return view('chimp.add_sub_edit',compact('subscriber'));
    }

    public function list_assign_member_deleteOld(Request $request,Subscriber $subscriber)
    {
        $user = Auth::user();
        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;

        $results = $this->chimp_list_member_update($subscriber,'delete');
        !is_array($results) && $results ?  $subscriber->delete() : null;

        return redirect()->route('email.contacts.setup.assign',$subscriber->user_mailing_list->id)->with('success','Contact Successfully Deleted!!!');
    }

    public  function sendEmail($content)
    {
        Mail::send('email_approved', $content, function ($m) use ($content) {
            $m->from('sms@deywuro.com', 'Deywuro');
            $m->to($content['to'],  $content['name']);
            $m->subject($content['subject'] ?? 'DEYWURO ALERT');
        });
    }

    public function mail_chimp_list($list)
    {
        try {
            $chimp = $this->init();
            return $chimp->post('lists',[
                'name'=>$list->name,
                'contact'=>[
                    'company'=>$list->company,
                    'address1'=>$list->address1,
                    'address2'=>$list->address2,
                    'city'=>$list->city,
                    'state'=>$list->state,
                    'zip'=>$list->zip,
                    'country'=>$list->country,
                    'phone'=>$list->phone,
                ],
                'permission_reminder'=>$list->permission_reminder,
                'email_type_option'=>false,
                'campaign_defaults'=>[
                    'from_name'=>$list->from_name,
                    'from_email'=>$list->from_email,
                    'subject'=>$list->subject,
                    'language'=>$list->language,
                ]
            ]);

        } catch (\Exception $e){
            return $e->getMessage();
        }
    }

    public function chimp_list_update($list)
    {
        try {
            $chimp = $this->init();
            return $chimp->patch("lists/$list->list_id",[
                'name'=>$list->name,
                'contact'=>[
                    'company'=>$list->company,
                    'address1'=>$list->address1,
                    'address2'=>$list->address2,
                    'city'=>$list->city,
                    'state'=>$list->state,
                    'zip'=>$list->zip,
                    'country'=>$list->country,
                    'phone'=>$list->phone,
                ],
                'permission_reminder'=>$list->permission_reminder,
                'email_type_option'=>false,
                'campaign_defaults'=>[
                    'from_name'=>$list->from_name,
                    'from_email'=>$list->from_email,
                    'subject'=>$list->subject,
                    'language'=>$list->language,
                ]
            ]);

        } catch (\Exception $e){
            return $e->getMessage();
        }
    }

    public function chimp_list_member_update($subscriber,$method)
{
    try {

        $chimp = $this->init();
        $subscriber_hash = $chimp::subscriberHash("{$subscriber->email_address}");
        return $chimp->$method("lists/{$subscriber->user_mailing_list->list_id}/members/{$subscriber_hash}");

    } catch (\Exception $e){
        return $e->getMessage();
    }
}

    public function address(Request $request)
    {
        $user = auth()->user();
        return $request->isMethod('post') ? $this->post_address($request,$user->campaign_address) : view('chimp.address',['address'=>$user->campaign_address]);
    }

    public function post_address(Request $request,$address)
    {
        $data = $request->validate(
            [
                'company'              => 'required',
                'address1'             => 'required',
                'address2'             => 'required',
                'city'                 => 'required',
                'state'                => 'required',
                'country'              => 'required',
                'zip'                  => 'required',
                'phone'                => 'required',
            ]
        );

        DB::beginTransaction();
            $address ? $address->update($data) : auth()->user()->campaign_address()->create($data);
        DB::commit();

        return redirect()->back()->with('success','Campaign Address Updated');
    }


    public function listOld(MailingListDataTable $mails, Request $request)
    {
        $keyword = $request->input('keyword') ?? '';
        return $mails->render('chimp.index',compact('keyword'));
    }

    public function list_createOld(Request $request)
    {
        $user = Auth::user();
        $current_audience = $user->mailing_list->count();

        if($request->isMethod('post'))
        {

            $request->validate(
                [
                    'name'                 => 'required',
                    'from_name'            => 'required',
                    'from_email'           => 'required',
                    'language'             => 'required',
                    'permission_reminder'  => 'required',
                    'company'              => 'required',
                    'address1'             => 'required',
                    'address2'             => 'required',
                    'city'                 => 'required',
                    'state'                => 'required',
                    'country'              => 'required',
                    'zip'                  => 'required',
                    'phone'                => 'required',
                ]
            );


            $data = $request->except('_token');


            DB::beginTransaction();

            /** @noinspection PhpUndefinedMethodInspection **/
            $list = $user->mailing_list()->create($data);

            DB::commit();
            $data = (object)$data;

            $content = [
                'to'      => 'support@npontu.com',
                'name'    =>  'NOC',
                'subject' =>  'NEW MAIL CHIMP AUDIENCE' ,
                'body'    =>  "The Client , {$user->username} has created a new mail audience on mail chimp <br>
with the name {$data->name}" ,
            ];

            $this->sendEmail($content);


            return redirect()->route('email.contacts.setup')->with('success','Mail list created successfully kindly review and publish the mail audience to activate it');
        }




        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly


        if(isset($limit) && $limit->no_audience <= $current_audience):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = "You have reached your mail audience limit of $limit->no_audience  !!";
            return redirect($route)->withErrors($flash);
        endif;

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;


        return view('chimp.create',['address'=>$user->campaign_address]);
    }

    public function list_editOld(Request $request,$id)
    {
        $user = Auth::user();
        $list = $user->mailing_list()->find($id);

        if($request->isMethod('post'))
        {

            $request->validate(
                [
                    'name'                 => 'required',
                    'from_name'            => 'required',
                    'from_email'           => 'required',
                    'language'             => 'required',
                    'permission_reminder'  => 'required',
                    'company'              => 'required',
                    'address1'             => 'required',
                    'address2'             => 'required',
                    'city'                 => 'required',
                    'state'                => 'required',
                    'country'              => 'required',
                    'zip'                  => 'required',
                    'phone'                => 'required',
                ]
            );


            $data = $request->except('_token');

            if($list->status != 'published') {
                $data['status'] = 'pending';
            }


            DB::beginTransaction();

            if($list->status == 'published'){
                $list->update($data);
                $status = $this->chimp_list_update($list);
                if(!isset($status['id'])){
                    return redirect()->route('email.contacts.setup')->withErrors('Update Failed  kindly try again');
                }
            }

            /** @noinspection PhpUndefinedMethodInspection */
            $list->update($data);

            DB::commit();



            return redirect()->route('email.contacts.setup')->with('success','Mail list updated successfully');
        }

        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;

        return view('chimp.edit',compact('list'));
    }

    public function list_deleteOld(UserMailingList $list)
    {
//        $chimp  = $this->init();
//        $html = file_get_contents(public_path('template/setup.html'));
//        $results  = $chimp->patch("templates/{$this->headerFooter_template}",[
////            'name'=>'user',
////            'name'=>'ImageAsContent',
//            'html'=>$html
//        ]);
//        dd($results);

        $user = Auth::user();
        $limit = $user->subscriptionLimits();// check for subscription limits and redirect accordingly

        if(!isset($limit)):
            $route = $user->under_reseller() ? url()->previous():  route('email.subscription.index');
            $flash = $user->under_reseller() ? 'Contact your account administrator to sign up on a mail package': 'kindly choose a package here !!';
            return redirect($route)->withErrors($flash);
        endif;


        try {

            $chimp =  $this->init();
            $delete = $chimp->delete("lists/$list->list_id");
            $flash =(object) ['status'=>'','flash'=>''];


            !is_array($delete) && $delete ? ($list->delete() AND
                ($flash->status ='success' AND $flash->flash ='List successfully deleted !!'))  :
                ($flash->status ='errors'  AND $flash->flash = $delete['detail']);


            return redirect()->back()->with($flash->status,$flash->flash);

        } catch (\Exception $e) {

            return redirect()->back()->withErrors($e->getMessage());
        }
    }


}
