<?php

namespace app\controller;

use Google\ApiCore\ApiException;
use support\Request;
use app\service\GoogleAdsCampaignService;
use app\service\GoogleAdsGroupService;
use app\service\GoogleAdsAdService;
use app\service\GoogleAdsAssetService;
use app\service\GoogleAdsAssetRelationService;
use app\service\GoogleAdsAccountService;
//use app\service\GoogleOAuthService;
use support\Response;
use DI\Annotation\Inject;
use think\facade\Db as ThinkDb;

class GoogleAdsController
{
    /**
     * @Inject
     * @var GoogleAdsCampaignService
     */

    private $googleAdsCampaignService;

    /**
     * @Inject
     * @var GoogleAdsGroupService
     */
    private $googleAdsGroupService;

    /**
     * @Inject
     * @var GoogleAdsAdService
     */
    private $googleAdsAdService;

    /**
     * @Inject
     * @var GoogleAdsAssetService
     */
    private $googleAdsAssetService;

    /**
     * @Inject
     * @var GoogleAdsAssetRelationService
     */
    private $googleAdsAssetRelationService;

    /**
     * @Inject
     * @var GoogleAdsAccountService
     */
    private $googleAdsAccountService;


    public function __construct()
    {

    }

    public function createCampaign(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->addCampaign($options);
    }

    public function listCampaigns(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->getCampaigns($options);
    }

    public function listGroups(Request $request)
    {
       $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->getGroups($options);
    }

    public function listAds(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->getAds($options);
    }

    public function listAssets(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->getAssets($options);
    }
    public function listAssetRelations(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        if($options['asset_type'] == 2){
            return $this->getVideoAssetRelations($options);
        }elseif($options['asset_type'] == 4){
          return  $this->getAssetRelations($options);
        }
    }

    public function listDateDatas(Request $request)
    {
        $options = $request->all();
        return $this->getDateDatas($options);
    }

    public function listCampaignsNext(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->getCampaignsNext($options);
    }

    public function deleteCampaign(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->removeCampaign($options);
    }

    public function updateCampaign(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->modifyCampaign($options);
    }

    public function createCampaignBudget(Request $request)
    {
        $options = $request->all();
//        return json(['code' => 0, 'msg' => getenv('GOOGLE_ADS_CUSTOMER_ID'),'data'=>$options]);
        // 继续处理 Google Ads API 操作
        return $this->addCampaignBudget($options);
    }


    public function createGroup(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->addGroup($options);
    }

    public function updateGroup(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->modifyGroup($options);
    }

    public function updateAd(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->modifyAd($options);
    }

    public function updateResponsiveSearchAd(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->modifyResponsiveSearchAd($options);
    }


    public function listResponsiveSearchAds(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->getResponsiveSearchAds($options);
    }

    public function listGoogleAdsFields(Request $request)
    {
        $options = $request->all();

        // 继续处理 Google Ads API 操作
        return $this->searchForGoogleAdsFields($options);
    }

    public function createLinkManagerToClient(Request $request)
    {
        $options = $request->all();
        // 继续处理 Google Ads API 操作
        return $this->addLinkManagerToClient($options);
    }


    /**
     * 创建广告系列
     * @throws ApiException
     */
    public function addCampaign($options): Response
    {
        // 使用 $options 数组中的数据进行 Google Ads API 的调用
        // 例如使用 $options['customer_id'] 和 $options['feed_id']
        // 调用相应的 Google Ads 服务
//        $budgetResourceName   = $this->googleAdsCampaignBudgetService->createCampaignBudget();
        $resourceName = $this->googleAdsCampaignService->runAddCampaign(4060397299, $options);
        return $this->successResponse(['campaign_resource_name' => $resourceName]);
    }

    /**
     * 创建广告预算
     * @throws ApiException
     */
    public function addCampaignBudget($options): Response
    {
        $resourceName = $this->googleAdsCampaignService->runAddCampaignBudget(0, $options);
        return $this->successResponse(['budget_resource_name' => $resourceName]);
    }

    /**
     * 关联广告客户ID
     * @throws ApiException
     */
    public function addLinkManagerToClient($options): Response
    {
        $resourceName = $this->googleAdsAccountService->runLinkManagerToClient($options);
        return $this->successResponse(['link_resource_name' => $resourceName]);
    }


    /**
     * get campaigns
     * @throws ApiException
     */
    public function getCampaigns($options): Response
    {
                $options['login_customer_id'] = 1401879025;
        $options['refresh_token'] = '1//0eeLHHxVH5EK1CgYIARAAGA4SNwF-L9Irjf3gV-k7bjIeT7WWpbNrvvJQU2cM9OTPUnG4aBYIJDntlUzQ8T1egKkQco5lNtg28FA';
        $resourceName = $this->googleAdsCampaignService->runListCampaigns($options['customer_id'], $options);
        return $this->successResponse(['campaigns_list' => $resourceName]);
    }

    /**
     * get groups
     * @throws ApiException
     */
    public function getGroups($options): Response
    {
        $resourceName = $this->googleAdsGroupService->runListGroups($options['customer_id'], $options);
        return $this->successResponse(['groups_list' => $resourceName]);
    }
    /**
     * get groups
     * @throws ApiException
     */
    public function getAds($options): Response
    {
//                $options['login_customer_id'] = 1401879025;
        $options['refresh_token'] = '1//0eeaBHt4kvLb1CgYIARAAGA4SNwF-L9IrnDelBOMlPpU-5W7Zvs7lfLW2XC5U0szxRM1_BkoNNVcWsAYc07Tf63dj1R0Ea-AtwZc';

        $resourceName = $this->googleAdsAdService->runListAds($options['customer_id'],$options);
        return $this->successResponse(['groups_list' => $resourceName]);
    }

    /**
     * get assets
     * @throws ApiException
     */
    public function getAssets($options): Response
    {
                        $options['login_customer_id'] = 1401879025;
        $options['refresh_token'] = ',1//0eeaBHt4kvLb1CgYIARAAGA4SNwF-L9IrnDelBOMlPpU-5W7Zvs7lfLW2XC5U0szxRM1_BkoNNVcWsAYc07Tf63dj1R0Ea-AtwZc';
        $resourceName = $this->googleAdsAssetService->runListCreatives($options['customer_id'],$options);
//        return $this->successResponse(['assets_list' => $resourceName]);
        return $this->successResponse(['assets_list' => 'succeed added']);
    }
    /**
     * get assets
     * @throws ApiException
     */
    public function getAssetRelations($options): Response
    {
//        dump($options);
        $resourceName = $this->googleAdsAssetRelationService->runListAssetRelations($options['customer_id']);
//        dump($resourceName);
//        return $this->successResponse($resourceName);
        return $this->successResponse(['assets_list' => $resourceName]);
//        return $this->successResponse(['assets_relation_list' => 'succeed added']);
    }

    /**
     * get assets
     * @throws ApiException
     */
    public function getVideoAssetRelations($options): Response
    {
        $resourceName = $this->googleAdsAssetRelationService->runListVideoAssetRelations($options['customer_id']);
        return $this->successResponse(['assets_relation_list' => $resourceName]);
//        return $this->successResponse(['assets_relation_list' => 'succeed added']);
    }

    /**
     * get date datas
     * @throws ApiException
     */
    public function getDateDatas($options): Response
    {
         $todayStart = date('Y-m-d', strtotime('0 day'));
        $options['login_customer_id'] = 2202747396;
        $options['refresh_token'] = '1//0eeaBHt4kvLb1CgYIARAAGA4SNwF-L9IrnDelBOMlPpU-5W7Zvs7lfLW2XC5U0szxRM1_BkoNNVcWsAYc07Tf63dj1R0Ea-AtwZc';
//        dump($todayStart);
        $resourceName = $this->googleAdsCampaignService->runListDateDatas($options['customer_id'],$options, '2024-12-21');
        return $this->successResponse(['date_datas_list' => $resourceName]);
    }

    /**
     * get campaigns Next
     * @throws ApiException
     */
    public function getCampaignsNext($options): Response
    {
        $data = $this->googleAdsCampaignService->runListCampaignsNext($options);
        return $this->successResponse($data);
    }

    /**
     * 删除广告系列
     * @throws ApiException
     */
    public function removeCampaign($options): Response
    {
        $resourceName = $this->googleAdsCampaignService->runRemoveCampaign($options);
        return $this->successResponse(['campaign_deleted' => $resourceName]);
    }

    /**
     * 更新广告系列
     * @throws ApiException
     */
    public function modifyCampaign($options): Response
    {
        $resourceName = $this->googleAdsCampaignService->runUpdateCampaign($options);
        return $this->successResponse(['campaign_updated' => $resourceName]);
    }

    /**
     * 新增广告组
     * @throws ApiException
     */
    public function addGroup($options): Response
    {
        $resourceName = $this->googleAdsGroupService->runAddGroup($options);
        return $this->successResponse(['groups_created' => $resourceName]);
    }

    /**
     * 更新广告组
     * @throws ApiException
     */
    public function modifyGroup($options): Response
    {
        $adGroupStatus               = [
            0,  // UNSPECIFIED
            1,  // UNKNOWN
            2,  // ENABLED
            3,  // PAUSED
            4   // REMOVED
        ];
        $options['bid_micro_amount'] = $options['amount'] * 1000000 < 0 ? 0 : $options['amount'] * 1000000;
        if (!in_array($options['status'], $adGroupStatus)) {
            return $this->errorResponse(101, 'status参数错误');
        }
        $resourceName = $this->googleAdsGroupService->runUpdateGroup($options);
        return $this->successResponse(['group_updated' => $resourceName]);
    }

    /**
     * 更新广告
     * @throws ApiException
     */
    public function modifyAd($options): Response
    {
        $adGroupStatus = [
            0,  // UNSPECIFIED
            1,  // UNKNOWN
            2,  // ENABLED
            3,  // PAUSED
            4   // REMOVED
        ];
        if (!in_array($options['status'], $adGroupStatus)) {
            return $this->errorResponse(101, 'status参数错误');
        }
//        dump($options['status'],$adGroupStatus);
        $resourceName = $this->googleAdsAdService->runUpdateAd($options);
        return $this->successResponse(['ad_updated' => $resourceName]);
    }


    /**
     * get campaigns
     * @throws ApiException
     */
    public function getResponsiveSearchAds($options): Response
    {
        $resourceName = $this->googleAdsAdService->runGetResponsiveSearchAds($options);
        return $this->successResponse(['ads_list' => $resourceName]);
    }

    /**
     * get campaigns
     * @throws ApiException
     */
    public function searchForGoogleAdsFields($options): Response
    {
        $googleAdsFieldData = $this->googleAdsAdService->runSearchForGoogleAdsFields($options);
        return $this->successResponse(['ads_fields' => $googleAdsFieldData]);
    }

    /**
     * get campaigns
     * @throws ApiException
     */
    public function modifyResponsiveSearchAd($options): Response
    {
        $resourceName = $this->googleAdsAdService->runUpdateResponsiveSearchAd($options);
        return $this->successResponse(['ad_updated' => $resourceName]);
    }


    // 可以加入一些公共方法
    protected function successResponse($data): Response
    {
        return Json([
            'code' => 0,
            'msg' => 'ok',
            'data' => $data,
        ]);
    }

    protected function errorResponse($code, $message, $data = []): Response
    {
        return Json([
            'code' => $code,
            'msg' => $message ?: 'error',
            'data' => $data
        ]);
    }

}