<?php
namespace App\Controllers\Client;
use App\Core\Service\Logger;
use App\Controllers\Client\OrderController;
use App\Library\Utilities;
use Exception;

class LeadController extends OrderController
{

    public function __construct()
    {
        parent::__construct();
    }
    
    public function addOrderFromLeadRequest() {
        try {
            if (empty($this->input['lead_ids'])) {
                throw new Exception('Lead id required');
            }
            $lead_ids = !is_array($this->input['lead_ids'])?[$this->input['lead_ids']]:$this->input['lead_ids'];
            $req_id = $this->Utilities->random_string('alnum');
            $tbl  = $this->FxModel->client_db_prefix.$this->user_data->comp_id . "." . $this->FxModel->tables['lead_order_logs'];
            $insarr = [];
            foreach ($lead_ids as $lead_id) {
                $insarr[] = ["req_id"=>$req_id, "lead_id"=>$lead_id];
            }
            $insrsp = $this->FxModel->batchInsert($tbl, $insarr);
            if (!$insrsp['status']) {
                throw new Exception($insrsp['error']);
            }
            $this->Kafkam->sendMessage("sanordo_create_order_from_lead", ['comp_id'=>$this->user_data->comp_id, 'user_id'=>$this->user_data->id, 'req_id'=>$req_id]);
            $this->sendResponse(array('code' => 200, 'message' => 'Reaquest sent to create order from lead.'));
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            $this->sendResponse(array('code' => 400, 'message' => $e->getMessage(), 'data' => null));
        }
    }

    public function createOrderFromLead($comp_id, $user_id, $req_id) {
        try {
            if(empty($comp_id)) {
                throw new \Exception("Company ID is required to process email/sms logs");
            }
            if(empty($user_id)) {
                throw new \Exception("User ID is required to process email/sms logs");
            }
            if(empty($req_id)) {
                throw new \Exception("Request ID is required to process email/sms logs");
            }

            $tbl = $this->FxModel->client_db_prefix.$comp_id . "." . $this->FxModel->tables['lead_order_logs'];
            $lrsp = $this->FxModel->fetchAllData("SELECT * FROM $tbl WHERE status=0 AND process=0 AND req_id=:req_id ORDER BY created_at", [':req_id'=>$req_id]);
            if(empty($lrsp['status'])) {
                throw new \Exception($lrsp['error']);
            }
            if(empty($lrsp['data'])) {
                throw new \Exception("No Pending logs found to create order from lead for Request ID:$req_id");
            }
            $usrs    = $this->FxModel->fetchSingleData("SELECT * FROM ".$this->FxModel->tables['users_master']." WHERE user_id=:id", [':id'=>$user_id]);
            if(empty($usrs['status'])) {
                throw new \Exception($usrs['error']);
            }
            $stbl = $this->FxModel->client_db_prefix.$comp_id . "." . $this->FxModel->tables['order_status'];
            $ordstrs = $this->FxModel->fetchSingleData("SELECT * FROM $stbl WHERE mark_as_default_complete=1 ORDER BY id");
            if(empty($ordstrs['status'])) {
                throw new \Exception($ordstrs['error']);
            }
            if(empty($ordstrs['data'])) {
                throw new \Exception("Initial/Default Order status is not configured");
            }
            $leadtbl = $this->FxModel->client_db_prefix.$comp_id . "." . $this->FxModel->tables['leads'];
            foreach($lrsp['data'] as $log) {
                $response   = '';
                $status     = 0;
                $process    = 0;
                $leadrsp = $this->FxModel->fetchSingleData("SELECT * FROM $leadtbl WHERE id=:lead_id", [':lead_id'=>$log['lead_id']]);
                if(empty($leadrsp['status'])) {
                    throw new \Exception($lrsp['error']);
                }
                if(empty($leadrsp['data'])) {
                    $response  = 'Lead Detail not found';
                    $process   = 1;
                } else {
                    $leadrsp['data']['current_order_status'] = $ordstrs['data']['id'];
                    $orders = $this->prepareOrderData($comp_id, $usrs['data'], $leadrsp['data']);
                    if(empty($orders['status'])) {
                        $response  = $orders['error'];
                    }
                    
                    $ordresp = $this->addUpdateOrder($orders['data'], $comp_id, $user_id);
                    if(empty($ordresp['status'])) {
                        $response  = $ordresp['error'];
                    } else {
                        $response  = "Order Created";
                        $process   = 1;
                        $status    = 1;
                    }
                }
                $updrs = $this->FxModel->update($tbl, ["response"=>$response, "status"=>$status, "process"=>$process], ["id"=>$log['id']]);
                if(empty($updrs)) {
                    Logger::error($updrs['error'], ['File' => __FILE__, 'Line' => __LINE__]);
                }
            }
            return ["status"=>true];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status"=>false, "error"=>"Error occurred while processing Lead order logs"];
        }
    }

    function prepareOrderData($comp_id, $user, $lead) {
        try {
            $order = $lead;

            $order['lead_id']       = $lead['id'];
            $order['customer_name'] = $lead['client_name'];
            $order['mobile_number'] = $lead['contact_no'];
            $order['phone_code']    = $lead['contact_code'];
            $order['email_id']      = $lead['email'];
            $order['alt_mobile1']   = $lead['alt_contact_no'];
            $order['branch_id']     = $lead['branch'];
            $order['address']       = $lead['address'];
            $order['address_pincode']   = $lead['pincode'];
            $order['address_state_id']  = $lead['state'];
            $order['address_city_id']   = $lead['city'];
            $order['address_mobile']    = '';
            $order['gst']               = '';
            $order['stock_status']      = '';
            $order['billing_pincode']   = $lead['pincode'];
            $order['billing_state']     = $lead['state'];
            $order['billing_city']      = $lead['city'];
            $order['billing_address']   = $lead['address'];
            $order['order_created_by_id']   = $user['user_id'];
            $order['order_booked_by_id']    = $user['user_id'];
            $order['order_booked_by_name']  = $user['user_name'];
            $order['item_list']         = [];
            $order['item_tax_list']     = [];
            unset($order['id']);
            $itemtbl = $this->FxModel->client_db_prefix.$comp_id . "." . $this->FxModel->tables['lead_item_list'];
            $itemrsp = $this->FxModel->fetchAllData("SELECT * FROM $itemtbl WHERE lead_id=:lead_id", [':lead_id'=>$lead['id']]);
            if(empty($itemrsp['status'])) {
                throw new \Exception($itemrsp['error']);
            }

            $taxtbl = $this->FxModel->client_db_prefix.$comp_id . "." . $this->FxModel->tables['lead_tax_list'];
            $taxrsp = $this->FxModel->fetchAllData("SELECT * FROM $taxtbl WHERE lead_id=:lead_id", [':lead_id'=>$lead['id']]);
            if(empty($taxrsp['status'])) {
                throw new \Exception($taxrsp['error']);
            }
            if(!empty($itemrsp['data'])) {
                foreach ($itemrsp['data'] as $k => $item) {
                    $item_detail = (array) json_decode($item['item_detail']);
                    $itemrsp['data'][$k]['item_code'] = $item_detail['item_code'];
                    $itemrsp['data'][$k]['group_id'] = $item_detail['group_id'];
                    $itemrsp['data'][$k]['unit'] = $item_detail['unit'];
                    $itemrsp['data'][$k]['total_rate'] = $item_detail['total_rate'];
                    $itemrsp['data'][$k]['image'] = $item_detail['image'];
                    $itemrsp['data'][$k]['variant_id'] = $item_detail['variant_id'];
                }
                $order['item_list'] = $itemrsp['data'];
            }
            if(!empty($taxrsp['data'])) {
                $order['item_tax_list'] = $taxrsp['data'];
            }
            return ["status"=>true, "data"=>$order];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status"=>false, "error"=>$e->getMessage()];
        }
    }
}
