<?php

namespace Lc\CaracoleBundle\Builder\User;

use Doctrine\ORM\EntityManagerInterface;
use Lc\CaracoleBundle\Factory\User\UserMerchantFactory;
use Lc\CaracoleBundle\Model\Credit\CreditHistoryInterface;
use Lc\CaracoleBundle\Model\Merchant\MerchantInterface;
use Lc\CaracoleBundle\Model\User\UserMerchantInterface;
use Lc\CaracoleBundle\Repository\User\UserMerchantStore;
use Lc\SovBundle\Model\User\UserInterface;

class UserMerchantBuilder
{
    protected EntityManagerInterface $entityManager;
    protected UserMerchantStore $userMerchantStore;

    public function __construct(
            EntityManagerInterface $entityManager,
            UserMerchantStore $userMerchantStore
    ) {
        $this->entityManager = $entityManager;
        $this->userMerchantStore = $userMerchantStore;
    }

    public function createIfNotExist(UserInterface $user, MerchantInterface $merchant): UserMerchantInterface
    {
        $userMerchant = $this->userMerchantStore
                ->setMerchant($merchant)
                ->getOneByUser($user);

        if (!$userMerchant) {
            $userMerchantFactory = new UserMerchantFactory();
            $userMerchant = $userMerchantFactory->create($user, $merchant);

            $this->entityManager->create($userMerchant);
            $this->entityManager->flush();
        }

        return $userMerchant;
    }

    public function init(
            UserInterface $user,
            MerchantInterface $merchant,
            bool $active = true,
            bool $creditActive = false,
            float $credit = null,
            bool $persist = true
    ): UserMerchantInterface {
        $userMerchant = $this->createIfNotExist($user, $merchant);

        $userMerchant->setActive($active);
        $userMerchant->setCreditActive($creditActive);
        $userMerchant->setCredit($credit);

        if ($persist) {
            //TODO create ou update ???
            $this->entityManager->persist($userMerchant);
            $this->entityManager->flush();
        }

        return $userMerchant;
    }

    public function activeCredit(UserMerchantInterface $userMerchant): UserMerchantInterface
    {
        return $this->updateCreditActive($userMerchant, true);
    }

    public function unactiveCredit(UserMerchantInterface $userMerchant): UserMerchantInterface
    {
        return $this->updateCreditActive($userMerchant, false);
    }

    public function updateCredit(
            UserMerchantInterface $userMerchant,
            CreditHistoryInterface $creditHistory,
            float $amount
    ): UserMerchantInterface {
        $userMerchant->setCredit($amount);

        $this->entityManager->update($creditHistory);
        $this->entityManager->update($userMerchant);
        $this->entityManager->flush();

        return $userMerchant;
    }

    public function updateCreditActive(
            UserMerchantInterface $userMerchant,
            $creditActive = true
    ): UserMerchantInterface {

        $userMerchant->setCreditActive($creditActive);

        //TODO create ou update ???
        $this->entityManager->persist($userMerchant);
        $this->entityManager->flush();

        return $userMerchant;
    }

}