<?php
namespace App\Jobs\Lazada;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Carbon\Carbon;
use DB;
use App\Lib\Lazada\LazopClient;
use App\Lib\Lazada\LazopRequest;
use App\Models\Campaign_model;
use App\Models\Campaign_voucher_model;
use App\Models\Lazada_voucher_model;
use App\Models\Lazada_voucher_detail_model;
use App\Models\Lazada_setting_model;
use App\Models\Setting_model;
use App\Models\Sponsor_model;
use App\Models\Sku_merchant_so_model;
use App\Jobs\Lazada\Email_lazada_voucher_job;
use App\Models\Log_lazada_model;

class Process_lazada_order_job implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $lazada_order_id;
    protected $lazada_request_id;
    protected $lazada_order;

    public function __construct($lazada_order_id, $lazada_request_id, $lazada_order)
    {
        $this->lazada_order_id = $lazada_order_id;
        $this->lazada_request_id = $lazada_request_id;
        $this->lazada_order = $lazada_order;
    }

    public function handle()
    {
        $now = Carbon::now();
        $lazada_setting = Lazada_setting_model::where("expires_in", ">=", date("Y-m-d H:i:s"))->first();
        $sponsor = Sponsor_model::where('id', env('ID_SPONSOR_LAZADA'))->first();
        $lazada_voucher = Lazada_voucher_model::where('order_id', $this->lazada_order_id)->exists();
        $arr_order_item = [];    

        if($lazada_setting && $sponsor) {
            try {
                DB::beginTransaction();
                if(!$lazada_voucher){
                    // get campaign
                    $campaign_name = $now->format('d M Y') . ' LAZADA E-Voucher';
                    $campaign = Campaign_model::where("campaign", $campaign_name)->first();
                    if (!$campaign) {
                        $settings = Setting_model::whereIn("type", ["harga_beli", "harga_jual"])
                            ->get()
                            ->mapWithKeys(function ($item) {
                                return [$item['type'] => $item['value']];
                            })
                            ->all();

                        $campaign = new Campaign_model;
                        $campaign->campaign = $campaign_name;
                        $campaign->id_sponsor = env("ID_SPONSOR_LAZADA");
                        $campaign->berlaku_sampai = $now->addMonths(3);
                        $campaign->harga_jual = $settings["harga_jual"];
                        $campaign->harga_beli = $settings["harga_beli"];
                        $campaign->grand_total = 0;
                        $campaign->is_aktif = '1';
                        $campaign->type = '2';
                        $campaign->save();
                    }

                    // save log 
                    $lazada_voucher = new Lazada_voucher_model;
                    $lazada_voucher->order_id = $this->lazada_order_id;
                    $lazada_voucher->request_id = $this->lazada_request_id;
                    $lazada_voucher->responses = json_encode($this->lazada_order);
                    $lazada_voucher->total_price = $this->lazada_order->price;
                    $lazada_voucher->save();

                    // get all order item
                    $c = new LazopClient(env('API_LAZADA_URL'), env('API_LAZADA_APPKEY'), env('API_LAZADA_APPSECRET'));
                    $request = new LazopRequest('/order/items/get', 'GET');
                    $request->addApiParam('order_id', $lazada_voucher->order_id);
                    $jdecode = json_decode($c->execute($request, $lazada_setting->access_token));                                    
                    foreach ($jdecode->data as $data) {                        
                        if ($data->is_digital === 1) {
                            $sku = Sku_merchant_so_model::where("sku", $data->sku)->where("type", (Sku_merchant_so_model::TYPE)['nominal']['id'])->first();
                            if($sku && $data->item_price >= (int) $sku->price - ((int) $sku->price * 10 / 100)) {                                  
                                $lazada_voucher_detail_exists = Lazada_voucher_detail_model::where("order_item_id", $data->order_item_id)->exists();
                                if(!$lazada_voucher_detail_exists) { 

                                    $campaign_voucher = new Campaign_voucher_model;
                                    $campaign_voucher->id_campaign = $campaign->id;
                                    $campaign_voucher->voucher_code = $this->generateRandomString($sponsor->kode, 12);
                                    $campaign_voucher->nominal = (int) $sku->price;
                                    $campaign_voucher->status = 0;
                                    $campaign_voucher->save();
                                    
                                    $lazada_voucher_detail = new Lazada_voucher_detail_model;
                                    $lazada_voucher_detail->order_item_id = $data->order_item_id;
                                    $lazada_voucher_detail->request_id = $this->lazada_request_id;
                                    $lazada_voucher_detail->lazada_voucher_id = $lazada_voucher->id;
                                    $lazada_voucher_detail->responses = json_encode($data);
                                    $lazada_voucher_detail->price = $data->item_price;
                                    $lazada_voucher_detail->id_campaign_voucher = $campaign_voucher->id;
                                    $lazada_voucher_detail->save();
                                    
                                    array_push($arr_order_item, (int) $data->order_item_id);  
                                }                          
                            }
                        }
                    }
                }

                $c = new LazopClient(env('API_LAZADA_URL'), env('API_LAZADA_APPKEY'), env('API_LAZADA_APPSECRET'));
                $request = new LazopRequest('/order/rts');
                $request->addApiParam('delivery_type', 'dropship');
                //$request->addApiParam('order_item_ids', $arr_order_item);
                $request->addApiParam('order_item_ids',  json_encode($arr_order_item));
                $request->addApiParam('shipment_provider', 'email');
                $request->addApiParam('tracking_number', '123456');
                $rts_response = $c->execute($request, $lazada_setting->access_token);
                $json_decode = json_decode($rts_response); print_r($json_decode);                         

                $log_rts = new Log_lazada_model();
                $log_rts->order_id = $lazada_voucher->order_id;
                $log_rts->request_id = $lazada_voucher->request_id;
                $log_rts->rts_response = $rts_response;
                $log_rts->rts_response_code = $json_decode->code;
                $log_rts->save();

                DB::commit();
                if($log_rts->responses_code==0) dispatch(new Email_lazada_voucher_job($lazada_voucher->id));                
            }
            catch(\Exception $e) {
                \Log::error($e);
                DB::rollback();
            }
        }
    }

    private function generateRandomString($prefix, $length)
    {
        $characters = '123456789ABCDEFGHIJKLMNPQRSTUVWXYZ';
        $charactersLength = strlen($characters);
        $randomString = '';
        do {
            for ($i = 0; $i < $length - strlen($prefix); $i++) {
                $randomString .= $characters[rand(0, $charactersLength - 1)];
            }
            $randomString = $prefix . $randomString;
            $total_data = Campaign_voucher_model::where('voucher_code', $randomString)->count();
        } while ($total_data != 0);
        return $randomString;
    }
}