<?php
namespace App\Model;
use App\Model\BaseModel;
use App\Core\Service\Logger;
use App\Config\Main;

class ReportModel extends BaseModel
{
    function __construct()
    {
        parent::__construct();
    }

    function getOrderListForReport($comp_id, $where, $page_no, $limit, $sortby, $reportby) {
        try {
            $countrs = $this->callProcedure($this->procedures['GetOrderListForReport'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'report_by'=>$reportby, 'count'=>1], true);
            if (empty($countrs['status'])) {
                throw new \Exception($countrs['error']);
            }
            $count  = $countrs['data']['count'];
            if($count > 0) {
                $result = $this->callProcedure($this->procedures['GetOrderListForReport'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'report_by'=>$reportby, 'count'=>0]);
                if(empty($result['status'])) {
                    throw new \Exception($result['error']);
                }
                return ["status"=>true, "data"=>$result['data'], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            } else {
                return ["status"=>true, "data"=>[], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            }
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function getItemListForOrderReport($comp_id, $where) {
        try {
            $dbrs = $this->callProcedure($this->procedures['GetItemListForReport'], ['comp_id'=>$comp_id, 'searchstr'=>$where]);
            if (empty($dbrs['status'])) {
                throw new \Exception($dbrs['error']);
            }
            return ["status"=>true, "data"=>$dbrs['data']];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function fetchGSTReport($comp_id, $where, $page_no, $limit, $sortby, $reportby) {
        try {
            $countrs = $this->callProcedure($this->procedures['GetGSTReport'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'report_by'=>$reportby, 'count'=>1], true);
            if (empty($countrs['status'])) {
                throw new \Exception($countrs['error']);
            }
            $count  = $countrs['data']['count'];
            if($count > 0) {
                $result = $this->callProcedure($this->procedures['GetGSTReport'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'report_by'=>$reportby, 'count'=>0]);
                if(empty($result['status'])) {
                    throw new \Exception($result['error']);
                }
                return ["status"=>true, "data"=>$result['data'], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            } else {
                return ["status"=>true, "data"=>[], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            }
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function fetchGSTReportTaxPerWise($comp_id, $where, $page_no, $limit, $sortby) {
        try {
            $countrs = $this->callProcedure($this->procedures['GetGSTReportTaxPerWise'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'count'=>1], true);
            if (empty($countrs['status'])) {
                throw new \Exception($countrs['error']);
            }
            $count  = $countrs['data']['count'];
            if($count > 0) {
                $result = $this->callProcedure($this->procedures['GetGSTReportTaxPerWise'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'count'=>0]);
                if(empty($result['status'])) {
                    throw new \Exception($result['error']);
                }
                return ["status"=>true, "data"=>$result['data'], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            } else {
                return ["status"=>true, "data"=>[], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            }
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function fetchGSTReportStateWise($comp_id, $where, $page_no, $limit, $sortby) {
        try {
            $countrs = $this->callProcedure($this->procedures['GetGSTReportStateWise'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'count'=>1], true);
            if (empty($countrs['status'])) {
                throw new \Exception($countrs['error']);
            }
            $count  = $countrs['data']['count'];
            if($count > 0) {
                $result = $this->callProcedure($this->procedures['GetGSTReportStateWise'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'count'=>0]);
                if(empty($result['status'])) {
                    throw new \Exception($result['error']);
                }
                return ["status"=>true, "data"=>$result['data'], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            } else {
                return ["status"=>true, "data"=>[], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            }
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function fetchGSTReportItemWise($comp_id, $company_name, $where, $page_no, $limit, $sortby) {
        try {
            $countrs = $this->callProcedure($this->procedures['GetGSTReportItemWise'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'company_name'=>$company_name, 'count'=>1], true);
            if (empty($countrs['status'])) {
                throw new \Exception($countrs['error']);
            }
            $count  = $countrs['data']['count'];
            if($count > 0) {
                $result = $this->callProcedure($this->procedures['GetGSTReportItemWise'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'company_name'=>$company_name, 'count'=>0]);
                if(empty($result['status'])) {
                    throw new \Exception($result['error']);
                }
                return ["status"=>true, "data"=>$result['data'], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            } else {
                return ["status"=>true, "data"=>[], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            }
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function fetchGSTReportRegisteredWise($comp_id, $where) {
        try {
            $result = $this->callProcedure($this->procedures['GetGSTReportRegisteredWise'], ['comp_id'=>$comp_id, 'searchstr'=>$where]);
            if(empty($result['status'])) {
                throw new \Exception($result['error']);
            }
            return ["status"=>true, "data"=>$result['data']];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function fetchGSTReportUnRegisteredWise($comp_id, $where) {
        try {
            $result = $this->callProcedure($this->procedures['GetGSTReportUnRegisteredWise'], ['comp_id'=>$comp_id, 'searchstr'=>$where]);
            if(empty($result['status'])) {
                throw new \Exception($result['error']);
            }
            return ["status"=>true, "data"=>$result['data']];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }
    
    function fetchGSTReportRegisteredAndUnRegisteredWise($comp_id, $where) {
        try {
            $center_registered = $local_registered = array();
            
            $registered = $this->callProcedure($this->procedures['GetGSTReportRegisteredWise'], ['comp_id'=>$comp_id, 'searchstr'=>$where]);
            if(empty($registered['status'])) {
                throw new \Exception($registered['error']);
            }
            if(!empty($registered)) {
                foreach($registered as $value) {
                    if ($value['state'] != $value['address_state_id']) {
                        $center_registered[] = $value;
                    } else {
                        $local_registered[] = $value;
                    }
                }
            }
            $unregistered = $this->callProcedure($this->procedures['GetGSTReportUnRegisteredWise'], ['comp_id'=>$comp_id, 'searchstr'=>$where]);
            if(empty($unregistered['status'])) {
                throw new \Exception($unregistered['error']);
            }
            return ["status"=>true, "data"=>['center_registered'=>$center_registered, 'local_registered'=>$local_registered, 'unregistered'=>$unregistered['data']]];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function fetchGSTReportHSNWise($comp_id, $where) {
        try {
            $result = $this->callProcedure($this->procedures['GetGSTReportHSNWise'], ['comp_id'=>$comp_id, 'searchstr'=>$where]);
            if(empty($result['status'])) {
                throw new \Exception($result['error']);
            }
            return ["status"=>true, "data"=>$result['data']];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function fetchGSTReportHSNSummaryWise($comp_id, $where) {
        try {
            $result = $this->callProcedure($this->procedures['GetGSTReportHSNSummaryWise'], ['comp_id'=>$comp_id, 'searchstr'=>$where]);
            if(empty($result['status'])) {
                throw new \Exception($result['error']);
            }
            return ["status"=>true, "data"=>$result['data']];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function fetchReportInventory($comp_id, $where, $page_no, $limit, $sortby, $reportby) {
        try {
            $countrs = $this->callProcedure($this->procedures['GetInventoryList'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'report_by'=>$reportby, 'count'=>1], true);
            if (empty($countrs['status'])) {
                throw new \Exception($countrs['error']);
            }
            $count  = $countrs['data']['count'];
            if($count > 0) {
                $result = $this->callProcedure($this->procedures['GetInventoryList'], ['comp_id'=>$comp_id, 'recpageno'=>$page_no, 'reclimit'=>$limit, 'sort_by'=>$sortby, 'searchstr'=>$where, 'report_by'=>$reportby, 'count'=>0]);
                if(empty($result['status'])) {
                    throw new \Exception($result['error']);
                }
                return ["status"=>true, "data"=>$result['data'], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            } else {
                return ["status"=>true, "data"=>[], "count"=>$count, "page"=>$page_no, "page_limit"=>$limit];
            }
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function getLeadConversionDashboardData($comp_id, $filters=[]) {
        try {
            $result = $this->callProcedureMultiResult($this->procedures['getDashboardReportList'], [
                'clientid'=>$comp_id,
                'agent_name'=>!empty($filters['user_id'])?$filters['user_id']:NULL,
                'tlname'=>!empty($filters['tl_id'])?$filters['tl_id']:NULL,
                'managername'=>!empty($filters['manager_id'])?$filters['manager_id']:NULL,
                'fromdate'=>!empty($filters['from_date'])?$filters['from_date']:NULL,
                'todate'=>!empty($filters['to_date'])?$filters['to_date']:NULL,
                'previousfromdate'=>!empty($filters['prev_from_date'])?$filters['prev_from_date']:NULL,
                'previoustodate'=>!empty($filters['prev_to_date'])?$filters['prev_to_date']:NULL, 
                'Lead_Type'=>!empty($filters['lead_type'])?$filters['lead_type']:'', 
                'doj'=>NULL
            ]);
            if(empty($result['status'])) {
                throw new \Exception($result['error']);
            }
            return ["status"=>true, "data"=>$result['data']];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function getSaleDashboardData($comp_id, $filters=[]) {
        try {
            $result = $this->callProcedureMultiResult($this->procedures['getoverallReportList'], [
                'clientid'=>$comp_id,
                'agent_name'=>!empty($filters['user_id'])?$filters['user_id']:NULL,
                'tlname'=>!empty($filters['tl_id'])?$filters['tl_id']:NULL,
                'managername'=>!empty($filters['manager_id'])?$filters['manager_id']:NULL,
                'fromdate'=>!empty($filters['from_date'])?$filters['from_date']:NULL,
                'todate'=>!empty($filters['to_date'])?$filters['to_date']:NULL,
                'Lead_Type'=>!empty($filters['lead_type'])?$filters['lead_type']:''
            ]);
            if(empty($result['status'])) {
                throw new \Exception($result['error']);
            }
            return ["status"=>true, "data"=>$result['data']];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }

    function getDeliveryDashboardData($comp_id, $filters=[]) {
        try {
            $result = $this->callProcedureMultiResult($this->procedures['getShipmentStatusReport'], [
                'clientid'=>$comp_id,
                'agent_name'=>!empty($filters['user_id'])?$filters['user_id']:NULL,
                'tlname'=>!empty($filters['tl_id'])?$filters['tl_id']:NULL,
                'managername'=>!empty($filters['manager_id'])?$filters['manager_id']:NULL,
                'fromdate'=>!empty($filters['from_date'])?$filters['from_date']:NULL,
                'todate'=>!empty($filters['to_date'])?$filters['to_date']:NULL,
                'Lead_Type'=>!empty($filters['lead_type'])?$filters['lead_type']:''
            ]);
            if(empty($result['status'])) {
                throw new \Exception($result['error']);
            }
            return ["status"=>true, "data"=>$result['data']];
        } catch (\Exception $e) {
            Logger::error($e->getMessage(), ['File' => $e->getFile(), 'Line' => $e->getLine()]);
            return ["status" => false, "error" => $e->getMessage()];
        }
    }
}