<?php

namespace App\Models;

use App\Command\Log;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Model;

class OrderDivideRecord extends Model
{
    use HasDateTimeFormatter;
    use SoftDeletes;
    protected $table = 'order_divide_record';

    public const COMMISSION_TYPE = [
        1 => '直推佣金',
        2 => '间推佣金',
        3 => '用户取货佣金',
    ];


    //收益分配
    public static function divide($order_id)
    {
        $div_members = []; //汇付 分账对象
        $orderObj = OrderInfo::find($order_id);
        $merchant_id = $orderObj->merchant_id; //绑定的商户
        $buyer_id = $orderObj->user_id; //下单用户ID
        $userObj = User::find($buyer_id);
        $spuid = $userObj->spuid; //直推分享人
        $second_spuid = $userObj->second_spuid; //间推分享人
        $total_amount = 0; //订单商品总价
        $first_proportion = $second_proportion = $merchant_proportion = ''; //佣金比例
        $sp_ogid = ''; //参与分佣商品ID
        $commissionPreData = [
            'first_member_id' => '',
            'first_amount' => 0,
            'second_member_id' => '',
            'second_amount' => 0,
            'merchant_member_id' => '',
            'merchant_amount' => 0,
        ];
        //直推是否实名
        $isFirstRealName = 0;
        if ($spuid) {
            $isFirstRealName = HfSettleAccount::where(['member_type' => 0, 'mid' => $spuid])->count();
        }
        //间推是否实名
        $isSecondRealName = 0;
        if ($second_spuid) {
            $isSecondRealName = HfSettleAccount::where(['member_type' => 0, 'mid' => $second_spuid])->count();
        }
        //商户是否实名
        $isMerchantRealName = 0;
        if ($merchant_id) {
            $hfCompanyMObj = HfCompanyMember::where('merchant_id', $merchant_id)->first();
            $isMerchantRealName = ($hfCompanyMObj->status == 'succeeded') ? 1 : 0;
        }

        $ogList = OrderGoods::where("order_id", $order_id)->get(); //订单商品
        foreach ($ogList as $kk => $item) {
            $goods_amount = $item->goods_price * $item->goods_number;
            $total_amount += $goods_amount;
            //商品信息
            $goodObj = Good::find($item->goods_id);
            $merchant_commission = $goodObj->merchant_commission;
            $first_commission = $goodObj->first_commission;
            $second_commission = $goodObj->second_commission;
            $first_proportion .= $goodObj->first_commission . ",";
            $second_proportion .= $goodObj->second_commission . ",";
            $merchant_proportion .= $goodObj->merchant_commission . ",";
            $sp_ogid = $item->id . ",";
            //直推佣金
            if ($spuid && $first_commission >= 1 && $first_commission < 100) {
                $divide_price = number_format($goods_amount * ($first_commission / 100), 2);
                $spObj = User::find($spuid);
                //汇付参数
                if ($spObj->member_id) {
                    $spObj->total_revenue += $divide_price; //总余额记录
                    $spObj->save();
                    //self::addRecord($item->id, $order_id, $goods_amount, $divide_price, $first_commission, $spuid, $user_id, 1, $isExistAccount);

                    $commissionPreData['first_member_id'] = $spObj->member_id;
                    $commissionPreData['first_amount'] += $divide_price;
                }
            }
            //间推佣金
            if ($second_spuid && $second_commission >= 1 && $second_commission < 100) {
                $divide_price = number_format($goods_amount * ($second_commission / 100), 2);
                $spObj = User::find($second_spuid);
                //汇付参数
                if ($spObj->member_id) {
                    $spObj->total_revenue += $divide_price;
                    $spObj->save();

                    $commissionPreData['second_member_id'] = $spObj->member_id;
                    $commissionPreData['second_amount'] += $divide_price;
                }
            }
            //商户分佣记录
            if ($merchant_id && $merchant_commission >= 1 && $merchant_commission < 100) {
                $divide_price = number_format($goods_amount * ($merchant_commission / 100), 2);
                //收益直接到商户账户
                $merObj = Merchant::find($merchant_id);
                //汇付参数
                $member_id = $hfCompanyMObj->member_id;
                if ($member_id) {
                    $merObj->total_revenue += $divide_price;
                    $merObj->save();
                    $commissionPreData['merchant_member_id'] = $member_id;
                    $commissionPreData['merchant_amount'] += $divide_price;
                }
            }
        }
        //组合分账参数
        if ($spuid && $first_commission >= 1 && $first_commission < 100 && $commissionPreData['first_amount'] > 0) {
            self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $commissionPreData['first_amount'], $first_proportion, $spuid, $buyer_id, 1, $isFirstRealName);
            if ($isFirstRealName) {
                array_push($div_members, ['member_id' => $commissionPreData['first_member_id'], 'amount' => sprintf("%.2f", $commissionPreData['first_amount']), 'fee_flag' => 'Y']);
            }
        }
        if ($second_spuid && $second_commission >= 1 && $second_commission < 100 && $commissionPreData['second_amount'] > 0) {
            self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $commissionPreData['second_amount'], $second_proportion, $second_spuid, $buyer_id, 2, $isSecondRealName);
            if ($isSecondRealName) {
                array_push($div_members, ['member_id' => $commissionPreData['second_member_id'], 'amount' => sprintf("%.2f", $commissionPreData['second_amount']), 'fee_flag' => 'Y']);
            }
        }
        if ($merchant_id && $merchant_commission >= 1 && $merchant_commission < 100 && $commissionPreData['merchant_amount'] > 0) {
            self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $commissionPreData['merchant_amount'], $merchant_proportion, $merchant_id, $buyer_id, 3, $isMerchantRealName);
            if ($isMerchantRealName) {
                array_push($div_members, ['member_id' => $commissionPreData['merchant_member_id'], 'amount' => sprintf("%.2f", $commissionPreData['merchant_amount']), 'fee_flag' => 'Y']);
            }
        }
        //商户本身
        $aimeiyuePrice = $total_amount - $commissionPreData['first_amount'] - $commissionPreData['second_amount'] - $commissionPreData['merchant_amount'];
        self::addRecord($sp_ogid, $order_id, $orderObj->goods_amount, $aimeiyuePrice, '', 0, $buyer_id, 0, 1);
        array_push($div_members, ['member_id' => 0, 'amount' => sprintf("%.2f", $aimeiyuePrice), 'fee_flag' => 'Y']);
        //确认分佣金额
        $confirm_amt = $aimeiyuePrice + $commissionPreData['first_amount'] + $commissionPreData['second_amount'] + $commissionPreData['merchant_amount'];
        return ['div_members' => $div_members, 'confirm_amt' => sprintf("%.2f", $confirm_amt)];
    }

    public static function addRecord($og_id, $order_id, $goods_amount, $divide_price, $commission = '', $um_id = 0, $buyer_id, $sh_type = 0, $isExistAccount)
    {
        $recordObj = new self();
        $recordObj->order_id = $order_id;
        $recordObj->user_id = $buyer_id;
        $recordObj->og_id = trim($og_id, ',');
        $recordObj->order_price = $goods_amount;
        $recordObj->divide_price = $divide_price;
        $recordObj->proportion = trim($commission, ',');
        $recordObj->um_id = $um_id;
        $recordObj->sh_type = $sh_type;
        $recordObj->is_div = $isExistAccount ? 1 : 0; //是否分账
        $recordObj->save();
        Log::add('订单分佣记录', $recordObj->toArray());
    }


    public function order()
    {
        return  $this->belongsTo(OrderInfo::class, 'order_id', 'id');
    }

    public function users()
    {
        return  $this->belongsTo(User::class, 'user_id', 'id');
    }
}