<?php

namespace App\Console\Commands;

use App\Imports\PersonalisedMailAudience;
use App\MailMergeJob;
use App\Traits\ChimpTrait;
use Carbon\Carbon;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;
use Maatwebsite\Excel\Facades\Excel;

class ProcessPersonalisedMailBlast extends Command
{
    use ChimpTrait;

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'check:personalized-mail';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $mail_job = MailMergeJob::query()->where([['status', 'pending'],['message', '!=', null], ['template_id', '!=', null]])->latest()->get();

        if($mail_job->count() > 0)
        {
            $mail_job->map(function ($personalised_blast) {

                if(Carbon::parse($personalised_blast->sched_datetime)->lte(now()))
                {
                    $file_path  = $personalised_blast->file_path;

                    $list = $personalised_blast->list;

                    $sheet = Excel::toCollection(new PersonalisedMailAudience(), $file_path, null);

                    $highestRow = sizeof($sheet[0]);

                    $rawValue = $sheet->toArray();

                    $headers = $rawValue[0][0];

                    $no_of_columns = count($headers);

                    unset($rawValue[0][0]);

                    $members = collect();

                    $contacts = $rawValue[0];

                    foreach($contacts as $contact_details)
                    {
                        $members_details = [];

                        $members_details['merge_fields'] = [];

                        $custom_fields = [];

                        for($column = 0; $column < $no_of_columns; $column++)
                        {
                            if($headers[$column] == 'email')
                            {
                                $merge_field_key = 'EMAIl';

                                $members_details['email_address'] = $contact_details[$column];

                                $members_details['merge_fields'][$merge_field_key] = $contact_details[$column];

                            }elseif ($headers[$column] == 'first_name')
                            {
                                $field_name = 'FIRST NAME';

                                $merge_field_key = 'FNAME';

                                $members_details['merge_fields'][$merge_field_key] = $contact_details[$column];

                                $members_details[$field_name] = $contact_details[$column];

                            }elseif ($headers[$column] == 'last_name') {

                                $field_name = 'LAST NAME';

                                $merge_field_key = 'LNAME';

                                $members_details['merge_fields'][$merge_field_key] = $contact_details[$column];

                                $members_details[$field_name] = $contact_details[$column];

//                            }
//                            elseif ($headers[$column] == 'address')
//                            {
//                                $members_details['ADDRESS'] = $contact_details[$column];
//
//                                $merge_field_key = 'ADDRESS';

                            } elseif ($headers[$column] == 'phone' || $headers[$column] == 'phone_number')
                            {
                                $field_name = 'PHONE NUMBER';

                                $merge_field_key = 'PHONE';

                                $members_details['merge_fields'][$merge_field_key] = $contact_details[$column];

                                $members_details[$field_name] = $contact_details[$column];
                            }
                            else{

                                $field_name = $headers[$column];

                                if($field_name  != '')
                                {
                                    Log::info('printing  | '.$field_name);

                                    $members_details[$field_name] = $contact_details[$column];

                                    $merge_field_key = strtoupper($headers[$column]);

                                    if ($merge_field_key != "")
                                    {
                                        if ($headers[$column] == 'address') {
                                            $type = 'address';
                                        } else if ($headers[$column] == 'date') {
                                            $type = 'date';
                                            $merge_field_key = 'SETDATE';
                                        } else if ($headers[$column] == 'dob') {
                                            $type = 'birthday';
                                        } else {
                                            $type = 'text';
                                        }

                                        $members_details['merge_fields'][$merge_field_key] = $contact_details[$column];

                                        array_push($custom_fields, [
                                            'name' => $merge_field_key,
                                            'type' => $type,
                                            'tag' => $merge_field_key,
                                            'default' => strtoupper($type)
                                        ]);
                                    }

                                }
                            }

//                            $merge_fields = explode(',', json_decode($personalised_blast->merge_fields)[0]);

//                            foreach($merge_fields as $merge_field)
//                            {

//                                if($merge_field_key != "")
//                                {
////
//                                    $members_details['merge_fields'][$merge_field_key] = $contact_details[$column];
//////
/////                                     $members_details['merge_fields'][strtoupper(str_replace('_', '', $merge_field))] = $contact_details[$column];
//                                }

//                            }

                            $members_details['status'] = 'subscribed';
                        }

                        $members->push($members_details);
                    }

                    Log::info('CUSTOM FIELDS | '.json_encode($custom_fields));

                    Log::info('MEMBERS | '.json_encode($members));

//                    dd('die here');

//                    try {

                    $chimp = $this->init();

                    foreach($custom_fields as $custom_field)
                    {
                        $new_fields = $chimp->post("lists/$list->list_id/merge-fields",[
                            'name' => $custom_field['name'],
                            'type' => $custom_field['type'],
                            'tag' => $custom_field['tag'],
                            'default_value' => $custom_field['default'],
                            'required' => false,
                            'public' => true
                        ]);

                        Log::info('new_fields | '. json_encode($new_fields));
                    }

                    $subscribers = $chimp->post("lists/$list->list_id",[
                        'members' => $members->toArray(),
                    ]);

                    if($subscribers)
                    {
                        Log::info('list | '.json_encode($subscribers));

//                        if(array_key_exists('errors', $subscribers))
//                        {
//                            $personalised_blast->update(['status' => 'failed', 'failed_reason' => 'Failed to store contacts on audience']);
//
//                        }else {

//                        if($personalised_blast->template)
//                        {
//                            $template = $chimp->post("templates", [
//                                'name' => $personalised_blast->template->template_name,
//                                'html' => $
//                            ];
//                        }

                        $campaign = $chimp->post("campaigns", [
                            'type' => 'regular',
                            'settings' => [
                                'subject_line' => $personalised_blast->subject_line,
                                'preview_line' => $personalised_blast->subject_line,
                                'title' => $personalised_blast->name,
                                'reply_to' => $personalised_blast->reply_to,
                                'from_name' => $personalised_blast->from_name
                            ],
                            'recipients' => [
                                'list_id' => $list->list_id
                            ]
                        ]);

                        Log::info(json_encode('campaign | ' . json_encode($campaign)));

                        if(!array_key_exists('id',  $campaign))
                        {
                            $personalised_blast->update(['status' => 'failed', 'failed_reason' => 'Failed to create campaign.']);

                        }else {

                            $app = env('APP_URL');
                            $path =  "$app/storage/template/";
                            $template_id = $personalised_blast->template->type == 'image' ? $this->bodyImage_template : $this->headerFooter_template;

                            $body_imageContent = [
                                'body'     => '<img  class="deviceWidth" src="'.$path.$personalised_blast->template->body_image.'"   alt="" border="0" width="100%">',
                                'subject'  => $personalised_blast->subject_line,
                            ];

                            $headerFooterContent = [
                                'body'     => $personalised_blast->message,
                                'subject'  => $personalised_blast->subject_line,
                                'header'   => '<img  class="deviceWidth" src="'.$path.$personalised_blast->template->template_head_image.'"   alt="" border="0" width="100%">',
                                'footer'   => '<img  class="deviceWidth" src="'.$path.$personalised_blast->template->template_footer_image.'" alt="" border="0" width="100%">',
                            ];


                            //set campaign content
                            $campaign_content = $chimp->put("campaigns/{$campaign['id']}/content", [
                                'template' => [
                                    'id' => $template_id,
                                    'sections' => $personalised_blast->template->type == 'image' ?  $body_imageContent  : $headerFooterContent,
                                ]
//                                    'plain_text' => $personalised_blast->message,
//                                'html' => "<p> ". nl2br($personalised_blast->message)." </p>",
                            ]);

                            $sent_campaign = $chimp->post("campaigns/{$campaign['id']}/actions/send");

                            Log::info($sent_campaign);

                            if ($sent_campaign) {

                                $personalised_blast->update(['status' => 'sent', 'sent_datetime' => now()]);

                            } else {

                                $personalised_blast->update(['status' => 'failed', 'sent_datetime' => now()]);
                            }
                        }
                    }
//                    }
                }

            });
        }

    }
}
