<?php

namespace Indeed\Uap\Migration;



abstract class AbstractMigrationService

{

    protected $serviceType = '';

    protected $entityType = '';

    protected $offset = 0;

    protected $limit = 100;

    protected $assignRank = false;

    protected $wpOptionName = 'uap_do_migrate_log';

    protected $entitiesList = array('affiliates');

    protected $logData = array();

    protected $stop = false;



    public function __construct($attr=array())

    {

        $this->serviceType = $attr['serviceType'];

        $this->entityType = $attr['entityType'];

        $this->offset = $attr['offset'];

        $this->assignRank = $attr['assignRank'];

    }



    abstract public function run();

    abstract protected function countAffiliates();

    abstract protected function countReferrals();



    public function initJobs()

    {

        $entireLog = get_option($this->wpOptionName);

        $this->logData = isset($entireLog[$this->serviceType]) ? $entireLog[$this->serviceType] : false;

        if (empty($this->logData) || $this->logData=='completed'){

            $this->logData = array(

                'affiliates-offset' => 0,

                'referrals-offset' => 0,

                'affiliates-count' => $this->countAffiliates(),

                'referrals-count' => $this->countReferrals(),

            );

            $entireLog[$this->serviceType] = $this->logData;

            update_option($this->wpOptionName, $entireLog);

        }

        if (empty($this->entityType)){

            $this->entityType = $this->entitiesList[0];

        }

        return $this;

    }



    public function updateOffset()

    {

        $this->offset = $this->offset + $this->limit;

        $this->logData[$this->entityType . '-offset'] = $this->offset;

        if ($this->logData[$this->entityType . '-offset']>=$this->logData[$this->entityType . '-count']){

            $this->logData[$this->entityType . '-offset'] = $this->logData[$this->entityType . '-count'];

            $this->offset = 0;

        }

        return $this;

    }



    public function updateEntity()

    {

        if (!isset($this->logData[$this->entityType . '-offset'])){

            return $this;

        }

        if ($this->logData[$this->entityType . '-offset']<$this->logData[$this->entityType . '-count']){

            return $this;

        }

        $key = array_search($this->entityType , $this->entitiesList);

        $key++;

        if (empty($this->entitiesList[$key])){

            $this->stop = true;

            return $this;

        }

        /// change the entity type

        $this->entityType = $this->entitiesList[$key];

        return $this;

    }



    public function updateLog()

    {

        $entireLog = get_option($this->wpOptionName);

        if ($this->stop){

            $entireLog[$this->serviceType] = 'completed';

        } else {

            $entireLog[$this->serviceType] = $this->logData;

        }

        update_option($this->wpOptionName, $entireLog);

        return $this;

    }



    public function redirect()

    {

        if ($this->stop==true){

            return true;

        }


        $postRequest = [
          'service_type'  => $this->serviceType,
          'entity_type'   => $this->entityType,
          'offset'        => $this->offset,
          'assignRank'    => $this->assignRank
        ];

        $curl = curl_init( admin_url('admin.php?uap_act=migrate') );
        curl_setopt( $curl, CURLOPT_POSTFIELDS, $postRequest );
        curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );

        $response = curl_exec($curl);
        curl_close($curl);
        
        exit;

    }



}

