<?php

namespace App\Web\Controllers;

use App\Exceptions\ApiException;
use App\Http\Controllers\BaseController;
use App\Web\Services\WebUtmService;
use Illuminate\Http\Request;


class WebUtmController extends BaseController
{

    protected $service = null;

    /**
     * 构造函数
     * BlogController constructor.
     */
    public function __construct(WebUtmService $service)
    {
        $this->service = $service;
    }

    /**
     * @param website_url 网址
     * @param campaign_id 广告系列ID
     * @param campaign_name 活动名称
     * @param campaign_source 活动来源
     * @param campaign_term 活动术语
     * @param campaign_medium 活动媒介
     * @param campaign_content 活动内容
     * campaign_source：标识为您的媒体资源带来流量的广告客户、网站、出版物等，例如：google、newsletter4、billboard。
     * campaign_medium：广告媒介或营销媒介，例如：每次点击费用、横幅广告和电子邮件简报。
     * campaign_name：产品的具体广告系列名称、标语、促销代码等。
     * campaign_term：标识付费搜索关键字。如果您采用人工方式标记付费关键字广告系列，那么您还应使用 campaign_term 来指定相应关键字。
     * campaign_content：用于区分相似内容或同一广告内的链接。例如，如果您在同一封电子邮件中使用了两个号召性用语链接，就可以使用 campaign_content 并为每个链接设置不同的值，以便判断哪个版本的效果更好。
     * 每个参数都必须对应一个您分配的值。这样，每个参数-值对就会包含与广告系列相关的信息。
     * 例如，您可以对自己的“夏季特惠”广告系列使用下列参数-值对：
     * campaign_source = summer-mailer，用来标识“夏季特惠”电子邮件广告系列带来的流量
     * campaign_medium = email，用来标识电子邮件广告系列带来的流量，而不是应用内广告系列带来的流量
     * campaign_name = summer-sale，用来标识整个广告系列
     * 如果您使用了这些参数，则您的自定义广告系列网址会如下所示：
     * https://www.example.com/?campaign_source=summer-mailer&campaign_medium=email&campaign_name=summer-sale
     * 向网址中添加参数时，您应当始终使用 campaign_source、campaign_medium 和 campaign_name。
     * campaign_term 和 campaign_content 是可选项。
     * campaign_ 只是这些参数的必需前缀。
     * @param Request $request
     * @return int|mixed
     * @throws ApiException
     * @throws \Illuminate\Validation\ValidationException
     */
    public function addOrModUtm(Request $request)
    {
        $this->validate($request, [
            'website_url' => 'required',
            'campaign_name' => 'required',
//            'campaign_medium' => 'required',
//            'campaign_source' => 'required',
        ], [
            'website_url.required' => 'website_url不能为空',
            'campaign_name.required' => 'campaign_name不能为空',
//            'campaign_medium.required' => 'campaign_medium不能为空',
//            'campaign_source.required' => 'campaign_source不能为空',
        ]);
        $websiteUrl = $request->input('website_url', '');
        if (!filter_var($websiteUrl, FILTER_VALIDATE_URL)) {
            throw new ApiException(10018, ['name' => 'URL无效']);
        }
        $params = $request->only(['id', 'website_url', 'campaign_id', 'campaign_name', 'campaign_source', 'campaign_term', 'campaign_medium', 'campaign_content']);
        $data = $this->service->addOrUpdUtm($params);
        return $this->jsonResponse(
            'ok',
            $data
        );
    }

    public function delUtm(Request $request)
    {
        $this->validate($request, [
            'id' => 'required',
        ], [
            'id.required' => 'id不能为空',
        ]);
        $ids = $request->input('id', 0);
        $data = $this->service->delUtm($ids);
        return $this->jsonResponse(
            'ok',
            $data
        );
    }

    public function getUtmList(Request $request)
    {
        $pageSize = $request->input('page_size', 10);
        $campaignName = $request->input('campaign_name', '');
        $campaignSource = $request->input('campaign_source', '');
        $campaignMedium = $request->input('campaign_medium', '');
        $orderBy = $request->input('order_by', '');
        $orderDirect = $request->input('order_direct', '');
        $data = $this->service->getWebUtmList($campaignName, $campaignSource, $campaignMedium, $pageSize, $orderBy, $orderDirect);
        return $this->jsonResponse(
            'ok',
            $data
        );
    }

    public function getUtmInfo(Request $request)
    {
        $this->validate($request, [
            'id' => 'required',
        ], [
            'id.required' => 'id不能为空',
        ]);
        $id = $request->input('id', 0);
        $data = $this->service->getUtm($id);
        return $this->jsonResponse(
            'ok',
            $data
        );
    }

    public function persistenceUtm()
    {
        $data = $this->service->persistenceUtmPvUv();
        return $this->jsonResponse(
            'ok',
            $data
        );
    }
}
