<?php

namespace App\Controllers\CLI;

use App\Controllers\BaseController;
use App\Services\Customer\ServiceService;
use App\Services\Customer\ServiceItemService;
use App\Services\Customer\ServicePaymentService;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;

class Payment extends BaseController
{
    private $_db = null;
    private ?ServiceService $_serviceService = null;
    private ?ServiceItemService $_servicItemeService = null;
    private ?ServicePaymentService $_servicePaymentService = null;
    public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
    {
        parent::initController($request, $response, $logger);
        // $this->_db = \Config\Database::connect();
    }
    public function getServiceService(): ServiceService
    {
        if (!$this->_serviceService) {
            $this->_serviceService = new ServiceService($this->request);
        }
        return $this->_serviceService;
    }
    public function getServiceItemService(): ServiceItemService
    {
        if (!$this->_servicItemeService) {
            $this->_servicItemeService = new ServiceItemService($this->request);
        }
        return $this->_servicItemeService;
    }
    public function getServicePaymentService(): ServicePaymentService
    {
        if (!$this->_servicePaymentService) {
            $this->_servicePaymentService = new ServicePaymentService($this->request);
        }
        return $this->_servicePaymentService;
    }
    public function billing(): void
    {
        //Transaction Start
        $this->getServiceService()->getModel()->transStart();
        try {
            //서비스중 결제일이 오늘인 서비스 모두 연장처리
            $this->getServiceService()->extendBillingAt(date('Y-m-d'), DEFAULTS['STATUS']);
            //결제일이 오늘보다 큰 서비스가져오기
            foreach ($this->getServiceService()->getEntities(['billing_at >' => date("Y-m-d")]) as $serviceEntity) {
                // echo $serviceEntity->getPK() . ":" . $serviceEntity->getBillingAt() . "\n";
                foreach ($this->getServiceItemService()->getEntities(['serviceinfo_uid' => $serviceEntity->getPK()]) as $itemEntity) {
                    //결제정보 ServicePaymentService에 월별 결제만 신규등록
                    if ($itemEntity->getBillingCycle() == "month") {
                        $this->getServicePaymentService()->createPaymentByServiceItem($itemEntity);
                    }
                }
            }
            // echo $this->getServiceService()->getModel()->getLastQuery() . "\n";
            log_message("notice", "Billing 작업을 완료하였습니다.");
            $this->getServiceService()->getModel()->transCommit();
        } catch (\Exception $e) {
            //Transaction Rollback
            $this->getServiceService()->getModel()->transRollback();
            log_message(
                "error",
                "Billing 작업을 실패하였습니다.\n--------------\n" .
                    $e->getMessage() .
                    "\n--------------\n"
            );
        }
    }
}
