<?php
namespace app\api\logic;

use app\adminapi\logic\property\PropertyUserLogic;
use app\common\logic\BaseLogic;
use app\common\model\coupon\CouponGoods;
use app\common\model\coupon\CouponRules;
use app\common\model\goods\Goods;
use app\common\model\goods_category\GoodsCategory;
use app\common\model\property\PropertyActivity;
use app\common\model\user\User;
use think\facade\Db;
use think\facade\Log;


/**
 * 活动逻辑处理
 * Class ActivityLogic
 * @package app\api\logic
 */
class ActivityLogic extends BaseLogic
{
    public static function getHomepageByActivityId($params){
        $res = [];
        try{
            $propertyActivity = PropertyActivity::with(['propertyHeadInfo'])->where('id',$params['property_activity_id'])->findOrEmpty();
            if($propertyActivity->isEmpty()){
                throw new \Exception('活动不存在');
            }
            if(!empty($propertyActivity->getData('activity_start_time')) && $propertyActivity->getData('activity_start_time') > time()){
                throw new \Exception('活动未开始');
            }
            if(!empty($propertyActivity->getData('activity_end_time')) && $propertyActivity->getData('activity_end_time') < time()){
                throw new \Exception('活动已结束');
            }
            Log::info('getHomepageByActivityId params:'.json_encode($params));
            if($params['user_id']){
                // property_head_id householder_mobile  householder_name address
                $userInfo = User::where('id',$params['user_id'])->findOrEmpty();
                if (!$userInfo->isEmpty()) {
                    // 检查/注册
                    Log::info('getHomepageByActivityId params-102:'.json_encode([$userInfo]));
                    PropertyUserLogic::getPropertyUserIdByMobile([
                        'householder_mobile' => $userInfo['mobile'],
                        'householder_name' => $userInfo['real_name'],
                        'address' => '',
                        'property_head_id' => $propertyActivity['property_head_id']
                    ]);
                }
            }
            $res['activity_info'] = $propertyActivity->toArray();
            if(in_array($res['activity_info']['url_page'],['adver','adver1','adver2'])){
                array_multisort(array_column($res['activity_info']['block_data'], 'sort'), SORT_DESC, $res['activity_info']['block_data']);
                foreach ($res['activity_info']['block_data'] as &$v){
                    array_multisort(array_column($v['goods'], 'recommend_weight'), SORT_DESC, $v['goods']);
                    if(!empty($v['goods'])){
                        foreach ($v['goods'] as &$item){
                            $item['service_fee'] = $item['base_service_fee'];
                        }
                    }
                    $v['goods'] = self::groupArrays($v['goods']);
                }
                $res['coupons'] = CouponRules::with(['couponCategoryOne'])->where('property_activity_id',$params['property_activity_id'])
                    ->select()
                    ->toArray();
                foreach ($res['coupons'] as &$coupon) {
                    $coupon['goods_category_id'] = $coupon['couponCategoryOne']['goods_category_id'];
                }
                $res['goods'] =  Goods::where('property_activity_id',$params['property_activity_id'])
                    ->where('is_agent',1)
                    ->visible(['id','goods_name','goods_image','base_service_fee','service_total','service_fee','goods_type'])
                    ->order('is_recommend desc')
                    ->select()
                    ->toArray();
                // 临时添加
                foreach ($res['goods'] as &$good){
                    $good['service_fee'] = $good['base_service_fee'];
                }
            }else{
                $res['block_data_structure'] = self::blockDataStructure($res['activity_info']['url_page'],$res['activity_info']['block_data']);
                $res['coupons'] = self::couponDataStructure($params['property_activity_id']);
            }
            return $res;
        }catch(\Exception $e){
            throw new \Exception($e->getMessage());
        }
    }
    public static function blockDataStructure(string $url_page,array $data): array {
        if (empty($data)) return [];
        array_multisort(array_column($data, 'sort'), SORT_DESC, $data);
        foreach ($data as &$v){
            array_multisort(array_column($v['goods'], 'recommend_weight'), SORT_DESC, $v['goods']);
            if(!empty($v['goods'])){
                foreach ($v['goods'] as &$item){
                    $reserved_fields = $item;
                    $item = Goods::findOrEmpty($item['id'])->toArray();
                    $item['code'] = '';
                    $goods_coupon_id = CouponGoods::where(['goods_id'=>$item['id']])->value('coupon_id')??0;
                    if($goods_coupon_id){
                        $coupon = CouponRules::where(['id'=>$goods_coupon_id])->field('code,server_category_name')->findOrEmpty();
                        $coupon && $item['server_category_name'] = nl2br($coupon['server_category_name'],false);
                        $coupon && $item['code'] = $coupon['code'];
                    }
                    foreach ($reserved_fields as $field => $value) {
                        !empty($value) && $item[$field] = $value;
                    }

                    // 临时改价 11-28
                    $item['service_fee'] = $item['base_service_fee'];
                }
            }
            // 不同模板 - 板块内商品数据结构不同
            switch ($url_page){
                case 'adver6':
                case 'adver5':
                    break;
                default:
                    $v['goods'] = self::groupArrays($v['goods']);
                    break;
            }
        }
        return $data;
    }
    public static function couponDataStructure(int $property_activity_id): array {
        $couponIds = self::getDataIdsByType($property_activity_id, 'coupon_data');
        $coupons = CouponRules::with(['couponCategoryOne'])
            ->where('id','in',$couponIds)
            ->select()
            ->toArray();
        foreach ($coupons as &$coupon) {
            $coupon['goods_category_id'] = $coupon['couponCategoryOne']['goods_category_id'];
        }
        return $coupons??[];
    }
    public static function groupArrays($array) {
        $result = []; $groupSize = 2;
        $totalElements = count($array);
        for ($i = 0; $i < $totalElements; $i += $groupSize)
        { $end = min($i + $groupSize, $totalElements);
            $result[] = array_slice($array, $i, $end - $i);
        }
        return $result;
    }
    public static function createPropertyOrder($params,$serviceOrder){
        try{
            // 代理活动
            if(isset($params['property_activity_id']) && !empty($params['property_activity_id'])){
                $propertyActivity = PropertyActivity::findOrEmpty($params['property_activity_id']);
                if($propertyActivity->isEmpty()){
                    throw new \Exception('活动不存在');
                }
                if(!empty($propertyActivity->getData('activity_start_time')) && $propertyActivity->getData('activity_start_time') > time()){
                    throw new \Exception('活动未开始');
                }
                if(!empty($propertyActivity->getData('activity_end_time')) && $propertyActivity->getData('activity_end_time') < time()){
                    throw new \Exception('活动已结束');
                }
                // 生成代理单 user_info
                // remark address  property_head_id  householder_name householder_mobile
                $result = PropertyOrderLogic::add(array_merge($params,[
                    'property_head_id' => $propertyActivity['property_head_id'],
                    'householder_mobile' => $params['user_info']['mobile'],
                    'householder_name' => $params['user_info']['real_name'],
                    'address' => $params['address'],
                    'remark' => '',
                    'order_status' => 1,
                    'work_id' => $serviceOrder['work_id'],
                ]));
                if($result === false){
                    throw new \Exception('生成代理单失败');
                }
            }elseif (isset($params['goods_id']) && !empty($params['goods_id'])) {
                // 判断商品是否为 代理活动商品
                $goods = Goods::findOrEmpty($params['goods_id']);
                if ($goods->isEmpty()) {
                    throw new \Exception('产品不存在！');
                }
                if ($goods->property_activity_id > 0) {
                    $propertyActivity = PropertyActivity::findOrEmpty($goods->property_activity_id);
                    if ($propertyActivity->isEmpty()) {
                        throw new \Exception('活动不存在');
                    }
                    if (!empty($propertyActivity->getData('activity_start_time')) && $propertyActivity->getData('activity_start_time') > time()) {
                        throw new \Exception('活动未开始');
                    }
                    if (!empty($propertyActivity->getData('activity_end_time')) && $propertyActivity->getData('activity_end_time') < time()) {
                        throw new \Exception('活动已结束');
                    }
                    // 生成代理单 user_info
                    // remark address  property_head_id  householder_name householder_mobile
                    $result = PropertyOrderLogic::add(array_merge($params, [
                        'property_head_id' => $propertyActivity['property_head_id'],
                        'householder_mobile' => $params['user_info']['mobile'],
                        'householder_name' => $params['user_info']['real_name'],
                        'address' => $params['address'],
                        'remark' => '',
                        'order_status' => 1,
                        'work_id' => $serviceOrder['work_id'],
                    ]));
                    if ($result === false) {
                        throw new \Exception('生成代理单失败');
                    }
                }
            }
            return true;
        }catch(\Exception $e){
            throw new \Exception($e->getMessage());
        }
    }
    public static function getDataIdsByType($property_activity_id, $type): array
    {
        $ids = [];
        $activityInfo = PropertyActivity::where('id',$property_activity_id)->findOrEmpty();
        if(!$activityInfo->isEmpty()){
            $activityInfo = $activityInfo->toArray();
            if($type === 'block_data'){
                foreach ($activityInfo['block_data'] as &$item) {
                    $ids = array_merge($ids,array_column($item['goods'], 'id'));
                }
            }
            if($type === 'coupon_data'){
                $activityInfo['coupon_data'] && $ids = array_merge($ids,array_column($activityInfo['coupon_data'], 'id'));
            }
        }
        return $ids??[0];
    }

}