<?php
namespace backend\modules\shop\logic;

use backend\modules\shop\models\ars\City;
use backend\modules\shop\models\ars\ExpressArea;
use backend\modules\shop\models\ars\Province;
use backend\modules\shop\models\ars\ExpressTemplate;

class ShopManager
{
    //单位类型
    const UNIT_TYPE_WEIGHT = 1; //重量
    const UNIT_TYPE_MONEY = 2;  //金额
    const UNIT_TYPE_ITEM = 3;   //件
    const UNIT_TYPE_LENGTH = 4; //长度,宽度,高度,直径

    /**
     * @param $type
     * @return int
     * 比例转换
     */
    public static function proportionalConversion($type)
    {
        switch ($type) {
            case self::UNIT_TYPE_WEIGHT:
                return 1000;    //后台显示为kg,数据库保存为g
                break;
            case self::UNIT_TYPE_MONEY:
                return 100; //后台显示为元,数据库保存为分
                break;
            case self::UNIT_TYPE_ITEM:
                return 1;   //后台显示和数据库都为件
                break;
            case self::UNIT_TYPE_LENGTH:
                return 1;   //后台和数据库都为毫米
                break;
            default:
                return 1;
        }
    }

    /**
     * @param ExpressArea|$expressAreaModel
     * @param ExpressTemplate|$expressTemplateModel
     * 区域运费模板按比例转化数据
     */
    public static function expressAreaScaleDate($expressAreaModel, $expressTemplateModel)
    {
        $expressAreaModel->basic_price *= self::proportionalConversion(self::UNIT_TYPE_MONEY);
        $expressAreaModel->extra_price *= self::proportionalConversion(self::UNIT_TYPE_MONEY);
        if ($expressTemplateModel->calculation_type == ExpressTemplate::CALCULATION_TYPE_WEIGHT) {
            $expressAreaModel->basic_count *= self::proportionalConversion(self::UNIT_TYPE_WEIGHT);
            $expressAreaModel->extra_count *= self::proportionalConversion(self::UNIT_TYPE_WEIGHT);
        } else {
            $expressAreaModel->basic_count *= self::proportionalConversion(self::UNIT_TYPE_ITEM);
            $expressAreaModel->extra_count *= self::proportionalConversion(self::UNIT_TYPE_ITEM);
        }
    }

    /**
     * @param ExpressArea|$expressAreaModel
     * @return array
     * 除去已被选取的城市,筛选剩下的城市数据
     */
    public static function filterCity($expressAreaModel)
    {
        $query = ExpressArea::find()
            ->select(['city'])
            ->where(['express_template' => $expressAreaModel->express_template]);
        if ($expressAreaModel->id) {    //修改操作时,除去自身的城市
            $query = $query->andWhere(['!=', 'id', $expressAreaModel->id]);
        }
        $allDate = $query->all();

        $expressAresCityIdArr = self::filterSelectedCtiyIdArr($allDate);

        $leftoverCityArr = self::filterLeftoverCityArr($expressAresCityIdArr);
        return $leftoverCityArr;
    }

    /**
     * @param $expressAreas
     * @return array 已选的城市id数组
     * 获取已选的城市id数组
     */
    private static function filterSelectedCtiyIdArr($expressAreas)
    {
        $expressAresCityIdArr = [];
        if ($expressAreas) {
            foreach ($expressAreas as $expressAreaCity) {
                $cityIdArr = explode(',', $expressAreaCity->city);
                $expressAresCityIdArr = array_unique(array_merge($cityIdArr, $expressAresCityIdArr));
            }
        }
        return $expressAresCityIdArr;
    }

    /**
     * @param $expressAresCityIdArr
     * @return array 未选的城市id数组
     * 筛选剩下的城市
     */
    private static function filterLeftoverCityArr($expressAresCityIdArr)
    {
        $data = [];
        $provinces = Province::find()->cache(0)->all();
        foreach ($provinces as $key => $province) {
            $cities = City::find()
                ->where(['province_id' => $province->province_id])
                ->andWhere(['not in', 'city_id', $expressAresCityIdArr])
                ->all();

            if ($cities) {
                $data[$key]['province'] = $province->name;
                foreach ($cities as $city) {
                    $data[$key]['city'][] = ['id' => $city->city_id, 'name' => $city->name];
                }
            }
        }
        return array_values($data);
    }
}