<?php

namespace App;

use App\Http\Controllers\Controller;
use App\Http\Controllers\LogisticNumberFeatureController;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Auth;
use Overtrue\LaravelPinyin\Facades\Pinyin;

/**
 * @method static find(array|string|null $param)
 */use App\Traits\ModelTimeFormat;

use App\Traits\ModelLogChanging;

class RejectedBill extends Model
{
    use ModelLogChanging;

    use ModelTimeFormat;
    use SoftDeletes;
    protected $fillable=['id_owner','order_number','sender','mobile_sender',
        'logistic_number','logistic_number_return','id_logistic_return',
        'is_loaded','fee_collected','remark','id_operator','is_checked',
        'is_finished','checked_numbers','remark','common_01','common_02'];

    /*
     *  id_owner                    货主
     *  order_number                订单号        OracleDOCOrderHeader->SOReference1
     *  mobile_sender               电话          OracleDOCOrderHeader->[c_tell1,c_tell2]
     *  logistic_number             原单单号
     *  logistic_number_return      退回单号
     *  id_logistic_return
     *  is_loaded                   是否入库
     *  fee_collected               到付费用
     *  remark                      备注          OracleDOCOrderHeader->notes
     *  id_operator
     *  is_checked                  是否审核
     *  is_finished                 是否完结
     *  checked_numbers             审核编号
     */

    protected $appends = ['owner_name','logistic_name'
        ,'is_loaded_str','goods_amount','is_loaded_null','operator_name'];
    function owner(){
        return $this->hasOne('App\Owner','id','id_owner');
    }
    function logistic(){
        return $this->hasOne('App\Logistic','id','id_logistic_return');
    }
    function items(){
        return $this->hasMany('App\RejectedBillItem','id_rejected_bill','id');
    }
    function user(){
        return $this->hasOne('App\User','id','id_operator');
    }
    function rejectedBillItems(){
        return $this->items();
    }
    function wmsReflectReceive(){
        return $this->belongsTo('App\WMSReflectReceive','id','id_rejected_bill');
    }

    function orderIssue()
    {
        return $this->hasOneThrough(OrderIssue::class,OrderIssueRejectedBill::class,'logistic_number_return','id','logistic_number_return','order_issue_id');
    }

    function orderIssueRejectedBill(){
        return $this->hasOne(OrderIssueRejectedBill::class,'logistic_number_return','logistic_number_return');
    }

    function setIsLoaded_toWaitConfirm(){
        if(config('api.jianshang_rejecteds_log_switch'))Controller::logS(__METHOD__,__FUNCTION__,"将待推单修改为待确认! 退单号：".$this['logistic_number_return'],Auth::user()['id']);
        $bill=RejectedBill::find($this['id']);
        $bill['is_loaded']=4;
        $bill->save();
    }
    function logisticName(){
        $logistic=$this->hasOne('App\Logistic','id','id_logistic_return')->first();
        return $logistic?$logistic['name']:'';
    }
    function makeCheckedNumbers(){
        $owner = $this->owner()->first();
        if(!$owner)return '';
        $pinyinOwnerName=Pinyin::convert($owner->name);
        $pinyinArr=array_map(function($pinyin){
            return $pinyin[0];
        },$pinyinOwnerName);
        $initials=implode("", $pinyinArr);
        $this['checked_numbers']=$initials.Carbon::now()->format('Ymd').$owner->getIncreasedCheckingCount();
        return $this['checked_numbers'];
    }



    function update(array $attributes = [], array $options = [])
    {
        (new LogisticNumberFeatureController())->createFeatures($this['logistic_number_return'],$this['id_logistic_return']);
        return parent::update($attributes, $options);
    }
    function save(array $options = [])
    {
        if($this['logistic_number_return'])(new LogisticNumberFeatureController())->createFeatures($this['logistic_number_return'],$this['id_logistic_return']);
        return parent::save($options);
    }


    public function getOwnerNameAttribute(){
        return $this->owner['name']??'';
    }
    public function getLogisticNameAttribute(){
        return $this->logistic['name']??'';
    }
    public function getIsLoadedStrAttribute(){
        $val=$this['is_loaded']===null?'null':$this['is_loaded'];
        $val=$val===0?'0':$val;
        switch ($val){
            case 'null':return '无需入库';
            case '0':return '否';
            case 1:return '是';
            case 2:return '待推单';
            case 3:return '上传异常';
        }
        return '';
    }
    public function getGoodsAmountAttribute(){
        $amount=0;
        $this->items->each(function (RejectedBillItem $item)use(&$amount){
            $amount+=$item['amount'];
        });
        return $amount;
    }
    public function getOperatorNameAttribute(){
        return $this['user'] ? $this['user']['name'] : null;
    }
    public function getIsLoadedNullAttribute(){
        if($this['is_loaded']===null) return 'null';
        return $this['is_loaded'];
    }
    public function changeIsLoaded_ifItemsAllLoaded(){
        $allItemsAreLoaded=true;
        $this->items->each(function (RejectedBillItem $item)use(&$allItemsAreLoaded){
            if($item['is_loaded']=='未入库'){
                $allItemsAreLoaded=false;
                return false;
            }
        });
        if($allItemsAreLoaded){
            $this['is_loaded']=1;
        }else{
            $this['is_loaded']=0;
        }
        $this->update();
        return $this['is_loaded'];
    }

    public function delete()
    {
        /** @var OrderIssue $orderIssue */
        $orderIssue = $this->orderIssue;
        if($orderIssue){
            $orderIssue->unJoinRejectedBill($this->logistic_number_return);
            $orderIssue->update(['is_new_rejecting'=>'无']);
            $orderIssue->syncRejectingStatus();
        }
        return parent::delete();
    }

    public function joinOrderIssue()
    {
        if(isset($this->orderIssueRejectedBill)){
            return;
        }
        /** @var OrderIssue $orderIssue */
        $orderIssue = $this->orderIssueRejectedBill->orderIssue ?? null;
        if($orderIssue){
            $orderIssue->joinRejectedBill($this->logistic_number_return);
            return;
        }
        // 原单退回
        if($this->logistic_number === '原单退回'){
            $orderIssue = OrderIssue::query()->where('order_id',function ($query){
                $query->from('order_packages')->selectRaw('order_id')->where('logistic_number',$this->logistic_number_return);
            })->first();
        }
        if(!$orderIssue){
            $orderHeader = OracleDOCOrderHeader::query()->selectRaw('OrderNO')->where('SoReference1', function ($query) {
                $query->select('AsnReference2')->from('DOC_ASN_HEADER')->where('AsnReference3', $this->logistic_number_return)->first();
            })->first();
            if(!$orderHeader)return;
            $orderIssue = OrderIssue::query()->where('order_id',function($query)use($orderHeader){
                $query->from('orders')->select('id')->where('code',$orderHeader->orderno);
            })->first();
        }
        if(!$orderIssue)return;
        $orderIssue->joinRejectedBill($this->logistic_number_return);
        $orderIssue->syncRejectingStatus();
    }

    public function syncOrderIssue()
    {
        if(isset($this->orderIssueRejectedBill)){
            if(isset($this->orderIssueRejectedBill->orderIssue)){
                /** @var OrderIssue $orderIssue */
                $orderIssue = $this->orderIssueRejectedBill->orderIssue;
                $orderIssue->syncRejectingStatus();
            }
        }
    }

    public function updateIsNewRejecting()
    {
        $orderIssue = $this->orderIssueRejectedBill->orderIssue ?? null;
        if($orderIssue) $orderIssue->update(['is_new_rejecting' => '有']);
    }
}
