<?php

/*
 * kohinos_cooperatic
 * Copyright (C) 2019-2020  ADML63
 * Copyright (C) 2020- Cooperatic
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
namespace App\Entity;

use App\Entity\GlobalParameter;
use App\Entity\Prestataire;
use App\Enum\MoyenEnum;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use ApiPlatform\Core\Annotation\ApiResource;
use Symfony\Component\Serializer\Annotation\Groups;

/**
 * TRANSFERT
 *  - PRESTATAIRES      =>     SIEGE                (Reconversion)
 *
 * @ORM\Entity()
 */
class TransfertPrestataireSiege extends Transfert
{
    /**
     * @ORM\OneToOne(targetEntity="Prestataire")
     * @ORM\JoinColumn(name="prestataire_id", referencedColumnName="id")
     */
    protected $expediteur;

    /**
     * @ORM\OneToOne(targetEntity="Siege")
     * @ORM\JoinColumn(name="siege_id", referencedColumnName="id")
     */
    protected $destinataire;

    /**
     * @var boolean
     * @Assert\Type("bool")
     * @ORM\Column(type="boolean")
     * @Groups({"read", "write"})
     */
    protected $reconverti = false;

    public function __construct()
    {
        parent::__construct();
        $this->reconverti = false;
    }

    public function getReconverti(): bool
    {
        return $this->reconverti;
    }

    public function setReconverti(bool $reconverti)
    {
        $this->reconverti = $reconverti;
        return $this;
    }

    /**
     * @return string
     */
    public function getType(): string
    {
        return 'reconversion';
    }

    public function operate($em)
    {
        $this->getExpediteur()->removeEcompte($this->getMontant());

        // On récupère le taux de reconversion (du formulaire s'il est précisé sinon par défaut dans la configuration globale)
        $taux = $this->getTauxreconversion();
        if (empty($taux)) {
            $taux = $em->getRepository(GlobalParameter::class)->val(GlobalParameter::RECONVERSION_PRESTATAIRE);
        }
        if ($taux > 0) {
            // On calcul les montants à virer au prestataire et la commission
            $montantAVirer = $this->getMontant() - ($this->getMontant()*($taux/100));
            $montantPreleve = $this->getMontant() - $montantAVirer;
            $this->setMontant($montantAVirer);
            $this->setTauxreconversion($taux);

            // On récupère le presta qui reçoit les commissions
            $mlcPrestataire = $em->getRepository(Prestataire::class)->findOneBy(array('mlc' => true));

            //Création d'un flux supplémentaire pour représenter la commission prise au prestataire et transféré à l'association qui gère la MLC
            $fluxCommission = new CommissionPrestataireMLC();
            $fluxCommission->setExpediteur($this->getExpediteur());
            $fluxCommission->setOperateur($this->getOperateur());
            $fluxCommission->setRole($this->getRole());
            $fluxCommission->setDestinataire($mlcPrestataire);
            $fluxCommission->setMontant($montantPreleve);
            $fluxCommission->setReference('Commission de reconversion');
            $fluxCommission->setMoyen(MoyenEnum::MOYEN_TRANSFERT);
            $fluxCommission->setTauxreconversion($taux);

            $mlcPrestataire->addEcompte($montantPreleve);

            return [$this->getExpediteur(), $this->getDestinataire(), $fluxCommission, $mlcPrestataire];
        }

        return [$this->getExpediteur(), $this->getDestinataire()];
    }

    public function getUsersToNotify()
    {
        return $this->getExpediteur()->getUsers()->toArray();
    }
}
