<?php
namespace App\Controllers\Advertisement;

use App\ThirdParty\facebook_api\ZenithFB;
use App\Libraries\slack_api\SlackChat;
use CodeIgniter\CLI\CLI;
use CodeIgniter\Controller;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use DateInterval;
use DatePeriod;

class Facebook extends Controller
{
    private $zenith;
    private $slack;

    public function __construct()
    {
        $this->zenith = new ZenithFB();       
        $this->slack = new SlackChat();
    }

    public function initController(
        RequestInterface $request,
        ResponseInterface $response,
        LoggerInterface $logger
    ) {
        $date = "";
        $today = date('Y-m-d');
        $argv = @$request->getServer()['argv'];
        if(!is_null($argv)) {
            $method = $argv[2];
            $params = @array_slice($argv, 3);
            if(!@count($params)) return;
            foreach($params as $v) {
                $value = preg_replace('/[^0-9\-]+/', '', $v);
                if(preg_match('/^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$/', $value)) { //request argument에 날짜형식이 있는지 체크
                    $date = $v;
                    break;
                }
            }
            /*
            $hour = date("G"); //24-hour format of an hour without leading zeros
            if($date == $today && ($hour >= 0 && $hour <= 7)) {
                CLI::write("당일 0시~8시는 자동업데이트를 사용할 수 없습니다.", "light_purple");
                exit;
            }
            */
        }
    }

    public function getAccounts() {
        $this->zenith->updateAdAccounts();
    }

    public function getLongLivedAccessToken() {
        $this->zenith->getLongLivedAccessToken();
    }

    public function getInsight($all=null, $date=null, $edate=null) {
        CLI::clearScreen();
        if($all == null)
            $all = CLI::prompt("인사이트가 수신된 캠페인,광고그룹,광고 데이터를 함께 수신하시겠습니까?\n(시간이 오래 걸릴 수 있습니다.)", ["true","false"]);
        if($date == null)
            $date = CLI::prompt("인사이트를 수신할 기간 중 시작날짜를 입력해주세요.", date('Y-m-d'));
        if($edate == null)
            $edate = CLI::prompt("인사이트를 수신할 기간 중 종료날짜를 입력해주세요.", $date);
        // $run = CLI::prompt("광고데이터를 ".($all=="true"?"포함":"미포함")."하여 {$date} ~ {$edate} 기간의 인사이트를 수신합니다.",["y","n"]);
        // if($run != 'y') return false;
        $this->zenith->getAsyncInsights($all, $date, $edate);
        CLI::write("데이터 수신이 완료되었습니다.", "yellow");
    }

    public function adLeadByAd($ad_id = null, $from = null, $to = null) {
        CLI::clearScreen();
        if($ad_id == null)
            $ad_id = CLI::prompt("잠재고객 업데이트 할 광고ID를 입력해주세요.");
        if($from == null)
            $from = CLI::prompt("잠재고객 업데이트 할 시작날짜를 입력해주세요.", date('Y-m-d'));
        if($to == null)
            $to = CLI::prompt("잠재고객 업데이트 할 종료날짜를 입력해주세요.", $from);
        $result = $this->zenith->adLeadByAd($ad_id, $from, $to);
        CLI::write("잠재고객 업데이트 완료되었습니다.", "yellow");
    }

    public function getAdLead($from = null, $to = null) {
        CLI::clearScreen();
        if($from == null)
            $from = CLI::prompt("잠재고객 업데이트 할 시작날짜를 입력해주세요.", date('Y-m-d'));
        if($to == null)
            $to = CLI::prompt("잠재고객 업데이트 할 종료날짜를 입력해주세요.", date('Y-m-d'));
        // $run = CLI::prompt("{$from}~{$to}일자의 잠재고객을 업데이트 합니다.",["y","n"]);
        // if($run != 'y') return false;
        $this->zenith->getAdLead($from, $to);
    }

    public function updateAll() {
        CLI::clearScreen();
        // $run = CLI::prompt("캠페인/광고그룹/광고를 업데이트 합니다.",["y","n"]);
        // if($run != 'y') return false;
        CLI::write("캠페인/광고그룹/광고를 업데이트 합니다.", "light_red");
        $this->zenith->updateAllByAccounts();
        /*
        $getAds = $this->zenith->getAds();
        $updateAdsets = $this->zenith->updateAdsets($getAds);
        $updateCampaigns = $this->zenith->updateCampaigns($updateAdsets);
        */
    }

    public function updateDB($sdate = null, $edate = null) {
        CLI::clearScreen();
        if($sdate == null)
            $sdate = CLI::prompt("유효DB 업데이트 할 시작날짜를 입력해주세요.", date('Y-m-d'));
        if($edate == null)
            $edate = CLI::prompt("유효DB 업데이트 할 종료날짜를 입력해주세요.", $sdate);
        $sdate = date_create($sdate);
        $edate = date_create(date('Y-m-d', strtotime($edate.'+1 days')));
        $interval = DateInterval::createFromDateString('1 day');
        $date_range = new DatePeriod($sdate, $interval, $edate);
        foreach($date_range as $date) {
            $date = $date->format('Y-m-d');
            CLI::write("{$date} 유효DB를 업데이트 합니다.", "light_red");
            $this->zenith->getAdsUseLanding($date);
        }
    }

    public function updateCampaign() {
        $campaign_id = CLI::prompt("업데이트 할 캠페인 ID를 입력해주세요.", null);
        if(is_null($campaign_id)) return;
        $data = [
            ['campaign_id'=>$campaign_id]
        ];
        $campaign = $this->zenith->updateCampaigns($data);
        print_r($campaign);
    }

    public function updateAds() {
        CLI::clearScreen();
        // $run = CLI::prompt("광고를 업데이트 합니다.",["y","n"]);
        // if($run != 'y') return false;
        CLI::write("광고를 업데이트 합니다.", "light_red");

        $this->zenith->updateAds();
    }
    public function updateAdCreatives() {
        CLI::clearScreen();
        $ad_id = CLI::prompt("업데이트 할 광고 ID를 입력해주세요.", null);
        if(is_null($ad_id)) return;
        $data = [
            ['id'=>$ad_id]
        ];
        // $run = CLI::prompt("광고를 업데이트 합니다.",["y","n"]);
        // if($run != 'y') return false;
        CLI::write("광고소재를 업데이트 합니다.", "light_red");

        $adcreative = $this->zenith->updateAdCreatives($data);
        print_r($adcreative);
    }
}