<?php
/**
  * @method 广告管理
  * @author soul
  * @copyright 2019/4/23
  */
class AdsPla extends AdsBase
{

   /**
    * @method 保存广告投放信息
    * @param  $plaArr array 广告位信息
    * @param  $adsArr array 广告信息
    * @param  $patArr array 投放时间信息
    * @param  $link string 网站底部信息
    * @author soul
    * @copyright 2019/4/23
    * @return  ['status'=>true,'data'=>pla_id]
    */
    function setPlaceAds($plaArr, $adsArr, $patArr,$link,$ignoreArr = [])
    {
		$now = time();
        $this->AdsDb->Begin();
		
		//用户广告
		$adsArr['ads_etime'] = $now;
		$adsArr['ads_url_data'] = $link;
		$adsArr['ads_u_id'] = (int) $adsArr['ads_u_id'];
		$adsArr['ads_art_id'] = (int) $adsArr['ads_art_id'];
		$adsArr['ads_shop_id'] = (int) $adsArr['ads_shop_id'];
		$adsArr['ads_proid'] = (int) $adsArr['ads_proid'];
		$adsArr['ads_price'] = sprintf('%.2f', $adsArr['ads_price']);
		$adsArr['ads_org_price'] = sprintf('%.2f', $adsArr['ads_org_price']);
		if(!empty($adsArr['ads_id']))
		{
            if($adsArr['ads_url_type'] != 'self')
            {
                $adsArr['ads_url'] = mvc::$cfg['HOST']['b2c'].'company/info?ads_id='.$adsArr['ads_id'];
            }
            unset($adsArr['ads_url_type']);
			$this->set('pj_user_ads', $adsArr, sprintf(" and ads_id=%d", $adsArr['ads_id']));
		}
		else
		{
			unset($adsArr['ads_id']);
			$adsArr['ads_atime'] = $now;
			$type = $adsArr['ads_url_type'];
			unset($adsArr['ads_url_type']);
			$res = $this->add('pj_user_ads', $adsArr);

            if($type != 'self')
            {
                $adsArr['ads_url'] =  mvc::$cfg['HOST']['b2c'].'company/info?ads_id='.$res['data'];
                $this->set("pj_user_ads",['ads_url' => $adsArr['ads_url']],sprintf(" and ads_id=%d",$res['data']));
            }

			$adsArr['ads_id'] = $res['data'];
		}

	
		//广告位关联用户广告
		$plaArr['pla_ads_id'] = $adsArr['ads_id'];
		$plaArr['pla_etime'] = $now;
		$plaArr['pla_sales'] = $plaArr['pla_sales']?:'';
		$plaArr['pla_au_uid'] = $plaArr['pla_au_uid']?:0;
		if($plaArr['pla_au_uid'] && !$plaArr['pla_sales']){
			$usres = (new B2cBase())->get('an_user',['au_name'],sprintf(" AND au_uid=%d",$plaArr['pla_au_uid']),true);
			$plaArr['pla_sales'] = $usres['au_name']?:'';
		}
		if(!empty($plaArr['pla_id']))
		{
			$this->set('pj_place_ads', $plaArr, sprintf(" and pla_id=%d", $plaArr['pla_id']));
		}
		else
		{
			unset($plaArr['pla_id']);
			$plaArr['pla_atime'] = $now;
			$res = $this->add('pj_place_ads', $plaArr);
			$plaArr['pla_id'] = $res['data'];
		}

		//投放时间
		$this->del('pj_place_ads_time', sprintf(" and pat_pla_id=%d", $plaArr['pla_id']));
		foreach($patArr as $v)
		{
			if($v['pat_btime'] > 0 && $v['pat_etime'] > 0)
			{
				$v['pat_pla_id'] = $plaArr['pla_id'];
				$this->add('pj_place_ads_time', $v);
			}
		}

		if($ignoreArr){
			$CrmBase = new CrmBase();
			$CrmBase->set('crm_customer',['ctr_level_id'=>'-1'],sprintf(" AND ctr_id IN (%s)",implode(',',$ignoreArr)));
			foreach ($ignoreArr as $val) {
				$logsData = [
					'ccl_ctr_id' => $val,
					'ccl_type' => 'set',
					'ccl_atime' => time(),
					'ccl_by_uid' => 8,
					'ccl_remark'=>'忽略原因：添加广告：'.$adsArr['ads_name'].'，存在多个手机号且非主账号手机'
				];
				$CrmBase->add('crm_customer_logs',$logsData);
			}
		}

		$this->AdsDb->End();
		return LibFc::ReturnData(true, $plaArr['pla_id']);
    }

   /**
    * @method 获取某个广告位的已投放区域的可用时间
    * @param  $pa_id int [必填] 广告位ID
    * @param  $pla_id int [选填] 已投放的广告ID，编辑情况下需要
    * @author soul
    * @copyright 2019/4/23
    * @return  ['status'=>true,'data'=>[]]
    */
    function getPlaceAvailableTime($pa_id, $pla_id = 0)
    {
		$arr = [];
		$pa_id = (int) $pa_id;
		$res = $this->get('pj_place', ['*'], sprintf(" and pa_id=%d", $pa_id), true);
		if(empty($res['data'])) 
			return LibFc::ReturnData(false, $pla_id.'广告位信息不存在！');
		$paArr = $res['data'];

		//地区广告
		if($paArr['pa_is_area'])
		{
			//已投放区域
			$where = sprintf(" and pla_pa_id=%d", $paArr['pa_id']);
			if(!empty($pla_id))
				$where .= sprintf(" and pla_id !=%d", $pla_id);
			$table = 'pj_place_ads_time join yp_province_city ON pat_pc_id = pc_id join pj_place_ads on pla_id=pat_pla_id';
			$res = $this->get($table, ['pc_id', 'pat_btime', 'pat_etime'], $where.' order by pc_id, pat_btime');
			$patArr = [];
			$allOpt = [];
			foreach($res['data'] as $v)
			{
				$allPcOpt[$v['pc_id']][] = $v['pat_btime'];
				$allPcOpt[$v['pc_id']][] = $v['pat_etime'];
				$patArr[$v['pc_id']][] = $v; 
			}
			
			$hasTime = [];
			$res = $this->get('pj_place_ads_time', ['pat_pc_id', 'pat_btime', 'pat_etime'], sprintf(" and pat_pla_id =%d order by pat_btime", $pla_id));
			foreach($res['data'] as $v)
			{
				$hasTime[$v['pat_pc_id']][] = ['b'=>date('Y-m-d', $v['pat_btime']), 'e'=>date('Y-m-d', $v['pat_etime'])];
			}

			$maxSame = $paArr['pa_max'];
			foreach($allPcOpt as $pcid=>$allOpt)
			{
				$allOpt = array_unique($allOpt);
				sort($allOpt);
				
				$smallOpt = [];
				$lastOpt = 0;
				foreach($patArr[$pcid] as $v)
				{
					foreach($allOpt as $kk=>$opt)
					{
						if($opt > $v['pat_etime']) break;
						$lastOpt = empty($lastOpt) ? $v['pat_btime']: $lastOpt;
						if($lastOpt >= $opt && !empty($allOpt[$kk+1]) && $allOpt[$kk+1] <= $v['pat_etime'])
						{
							$smallOpt[date('Y-m-d', $lastOpt).'_'.date('Y-m-d', $allOpt[$kk+1])]++;
							$lastOpt = $allOpt[$kk+1];
						}
					}
				}

				//不可用时间段
				$nullTime = [];
				$topt = [];
				foreach($smallOpt as $t=>$count)
				{
					if($count >= $maxSame)
					{
						$tt = explode('_', $t);
						$topt = array_merge($topt, $tt); 
						$nullTime[] = $t;
					}
				}
				
				
				//计算可用时间
				if(empty($topt))
				{
					if(!empty($hasTime[$pcid]) && strtotime($hasTime[$pcid][0]['b']) < time())
					{
						$topt[] = date('Y-m-d', strtotime($hasTime[$pcid][0]['b'])-1);
					}
					else
					{
						$topt[] = date('Y-m-d');
					}
				}
				$topt[] = date('Y-m-d', strtotime("+1 year"));
				$topt = array_unique($topt);
				sort($topt);
				
				foreach($topt as $k=>$v)
				{
					if(($k+1) < count($topt) && !in_array($v.'_'.$topt[$k+1], $nullTime))
					{
						$b = date('Y-m-d', strtotime($v)+3600*24);
						$e = date('Y-m-d', strtotime($topt[$k+1])-1);
						$val = '';
					    if(!empty($hasTime[$pcid])){
							foreach($hasTime[$pcid] as $hk=>$hv)
							{
								if(strtotime($hv['b']) >= strtotime($b) && strtotime($hv['e']) <= strtotime($e))
								{
									$val = $hv['b'].' ~ '.$hv['e'];
								}
							}
							$arr[$pcid][] = ['b'=>$b, 'e'=>$e , 'val'=>$val];
						}
					}
				}
			}
		}
		return LibFc::ReturnData(true, $arr);
	}

	/**
	 * @param  int $plaId
	 * @method 删除广告位
	 * @author zhengweihua 
	 * @copyright 2024-04-24
	 */
	public function delAds($plaId)
	{
		if(!$plaId) return LibFc::ReturnData(false,'参数错误');

		$res = $this->get('pj_place_ads',['pla_id,pla_ads_id'],sprintf(" AND pla_id=%d",$plaId),true);
		$adsId = $res['data']['pla_ads_id'];
		if($adsId)
		{
			$adsReportDate = $this->get('pj_ads_report_date',['ard_ads_id','sum(ard_show) as ard_show_sum'],sprintf(' and ard_ads_id = %d group by ard_ads_id',$adsId),true);
			if(!empty($adsReportDate['data']) && $adsReportDate['data']['ard_show_sum']>0)
			{	
				return LibFc::ReturnData(false,'该广告位存在展现数，不可删除');
			}
		}
		$this->AdsDb->Begin();
		$this->del('pj_user_ads',sprintf(" AND ads_id=%d",$adsId));
		$this->del('pj_place_ads',sprintf(" AND pla_id=%d ",$plaId));
		$this->del('pj_place_ads_time',sprintf(" AND pat_pla_id=%d",$plaId));
		$this->AdsDb->End();
		return LibFc::ReturnData(true,'删除成功');

	}
}
