<?php

namespace App\Http\Controllers;

use App\DataTables\PersonalisedMailAudienceDataTable;
use App\DataTables\PersonalizedMailBlastDataTable;
use App\Email_templates;
use App\Filters;
use App\Imports\PersonalisedMailAudience;
use App\MailMergeJob;
use App\Traits\ChimpTrait;
use App\UserMailingList;
use App\UserSenderId;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redirect;
use Maatwebsite\Excel\Facades\Excel;

class PersonalizedMailController extends Controller
{
    use ChimpTrait;

    public function viewAudienceList(PersonalisedMailAudienceDataTable $dataTable)
    {
        return $dataTable->render('mailchimp_personalised_emails.index');
    }

    public function addSubscribersNewList(UserMailingList $list)
    {
        $step = 1;

        return view('mailchimp_personalised_emails.audience_import', compact('list', 'step'));
    }

//    public function create()
//    {
//        $step = 1;
//        //reset current session data for sending single sms
//        if (session()->has('bulk_sms_personalised_data')) {
//            session()->forget('bulk_sms_personalised_data');
//        }
//        if (session()->has('alert')) {
//            session()->forget('alert');
//        }
//        //show view
//        return view('sms.send_bulk_personalised_sms', [
//            'step' => $step,
//            'sender_ids' => UserSenderId::query()->where([['user_id', Auth::user()->id], ['status', 1]])->get()
//        ]);
//    }

    public function getMailAndMergeFields(UserMailingList $list,Request $request)
    {
        #--------------------------------------------------

        $user = Auth::user();

        //get current step
        $step = $request->get('step', 1);

        //process for step 1
        if ($step == 1) {
            //validate the request
            $tank = $this->validate($request, [
                'file_upload' => 'required|mimes:csv,txt,xlsx,xls',
                'schedule_date' => 'present',
                'name' => 'required',
            ]);

            $schedule_date = Carbon::parse($tank['schedule_date']);

            session(['schedule_date' => $schedule_date]);

            /***  We get the filters from here ***/
            $filters = Filters::query()->get();
            /** @var  $banned @as an array for the newly filtered records */
            $banned = array();
            /** @var  $flash @for linear array */
            $flash = null;

            /** @var  $filth @foreach to loop through keywords  * */
            foreach ($filters as $filth)
                array_push($banned, strtolower($filth->keyword));


            /** @var  $new_strings @exploding occurs here  * */
            $new_strings = explode(" ", strtolower($request->message_content));
            $result = array_intersect($banned, $new_strings);
            if (!empty($result)):
                foreach ($result as $value):
                    $flash .= $value . ', ';
                endforeach;
                return \redirect()->back()->withErrors("The following words are not permitted:  {$flash}");
            endif;


            /** @var  @the rest @occurs here */
            $current_filename = $request->file('file_upload')->getClientOriginalName();
            $filename_splitted = explode(".", $current_filename);
            $extension = end($filename_splitted);

            $destinationPath = storage_path() . DIRECTORY_SEPARATOR . 'mail_merge' . DIRECTORY_SEPARATOR;
            $fileName = $user->username . '_' . date('YmdHis') . '.' . $extension;
            $full_filename = $destinationPath . $fileName;

            if ($request->file('file_upload')->isValid()) {
                $request->file('file_upload')->move($destinationPath, $fileName);
                @chmod($full_filename, 0777);
            } else {
                return Redirect::back()->withInput()->withErrors(array('file_upload' => 'Sorry, The file upload failed!'));
            }

            $highestRow = 0;
            $headers = [];
            $first_record = [];

            try {
//                Excel::load($full_filename, function ($reader) use (&$highestRow) {
//                    $highestRow = $reader->getExcel()->getSheet(0)->getHighestRow();
//                });
                $sheet = Excel::toCollection(new PersonalisedMailAudience(), $full_filename, null);
                $highestRow = sizeof($sheet[0]);
                $rawValue = $sheet->toArray();
                $head = $rawValue[0][0];
                $head2 = $rawValue[0][1];

//                return $head2;

                foreach ($head as $header)
                    $headers[] = $header;

                foreach ($head2 as $header2)
                    $first_record[] = $header2;

            } catch (\Throwable $e) {
//                throw $e;
                return Redirect::back()->withInput()->withErrors(array('file_upload' => 'Error! Your excel file is invalid!'));
            }

            //store user input in the new session data
            session(['personalized_email' => [
                'current_file_name' => $current_filename,
                'flash' => $request->get('flash'),
                'recipients' => $highestRow,
                'path' => $full_filename,
                'headers' => $headers,
                'schedule_date' => $request->input('schedule_date'),
                'name' => $request->get('name'),
                'remove_duplicate' => $request->has('remove_duplicate')
            ]]);

            $step = 2;
        } //process for step 2
        else if ($step == 2) {
            //check if next button was pressed
            if ($request->filled('next')) {
                $flash = session('personalized_email')['flash'];
                $nummsisdn = session('personalized_email')['recipients'];
                $msgs = $request->message_content;
                $path = session('personalized_email')['path'];
                $name = session('personalized_email')['name'];
                $remove_duplicate = session('personalized_email')['remove_duplicate'];

                if (isset(session('personalized_email')['schedule_date']) && !empty(session('personalized_email')['schedule_date']))
                {
                    $sch_date = Carbon::parse(session('personalized_email')['schedule_date']);
                    $now = Carbon::now()->addMinutes(1);
                    $date = $now->lte($sch_date) ? $sch_date : $now;
                } else {
                    $date = Carbon::now()->addMinutes(1);
                }

                    $job = MailMergeJob::create([
                        'username' => $user->username,
                        'message' => $msgs,
                        'sched_datetime' => $date < now() ? now()->addMinutes(1) : $date,
                        'created_by' => $user->username,
                        'file_path' => $path,
                        'user_id' => auth()->id(),
                        'name' => $name,
                        'total_traffic' => $nummsisdn,
                        'list_id' => $list->id,
                        'remove_duplicate' => $remove_duplicate,
                        'merge_fields' => json_encode($request->merge_fields)
                    ]);

                    session(['mail_merge_id' => $job->id]);

                    //update audit trails
                    $user->audit_trails()->create([
                        'username' => $user->username,
                        'date' => Carbon::now()->toDateTimeString(),
                        'activity' => $user->username . ' added a campaign '
                    ]);

                $step = 3;

                $templates = Email_templates::query()->where([['client_id','=', auth()->user()->id], ['type', 'header/footer']])->get();


            } //in case back button was pressed

            else {
                //go back to step 1
                $step = 1;
            }
        }

        else if($step == 3)
        {
            $mail_merge_job = MailMergeJob::find(session('mail_merge_id'));

            $mail_merge_job->update([
                'subject_line' => $request->subject,
                'from_name' => $request->from_name,
                'to_name' => $request->to_name,
                'template_id' => $request->template_id,
                'reply_to' => $request->reply_to
            ]);

            $request->session()->forget('personalized_email');
//            if (!$request->session()->has('success') || empty(session('success')))
//                $request->session()->flash('success', 'Your contacts was successfully uploaded!');

            return redirect()->route('personalised.blast.report')->with('success', 'Your contacts was successfully uploaded  and will be processed on the scheduled time');
        }

        if($step == 3)
        {
            return view('mailchimp_personalised_emails.audience_import', ['step' => $step, 'templates' => $templates]);
        }

        return view('mailchimp_personalised_emails.audience_import', ['step' => $step]);
    }

//    public function list(PersonalisedMailAudienceDataTable $dataTable)
//    {
//        return $dataTable->render('chimp.index');
//    }

    public function viewBlastReport(PersonalizedMailBlastDataTable $dataTable)
    {
        return $dataTable->render('mailchimp_personalised_emails.blast_report');
    }

}
