<?php

namespace App\Entity;

use App\Repository\ContratRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Ignore;
use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ORM\Entity(repositoryClass=ContratRepository::class)
 * @ORM\Table(schema="sav")
 */
class Contrat
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     * @Groups({"api", "planning"})
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity=Equipement::class, inversedBy="contrats")
     * @ORM\JoinColumn(name="idequipement")
     */
    private $equipement;

    /**
     * @ORM\ManyToOne(targetEntity=Client::class, inversedBy="contrats")
     * @ORM\JoinColumn(name="idclient")
     */
    private $client;

    /**
     * @ORM\ManyToOne(targetEntity=ContratType::class, inversedBy="contrats")
     * @ORM\JoinColumn(name="idcontrat_type")
     * @Groups({"api", "map", "planning"})
     */
    private $contrat_type;

    /**
     * @ORM\Column(type="boolean", nullable=true)
     */
    private $edition;

    /**
     * @ORM\Column(type="float", nullable=true)
     */
    private $coefficient;

    /**
     * @ORM\Column(type="float", nullable=true)
     * @Groups({"api"})
     */
    private $montant_ht;

    /**
     * @ORM\ManyToOne(targetEntity=Utilisateur::class, inversedBy="contrats_agent_souscripteur")
     * @ORM\JoinColumn(name="idagent_souscription")
     */
    private $agent_souscription;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $date_souscription;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     * @Groups({"api", "planning"})
     */
    private $date_debut_contrat;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     * @Groups({"api", "planning"})
     */
    private $date_fin_contrat;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $date_avis_echeance;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     */
    private $date_paiement;

    /**
     * @ORM\Column(type="text", nullable=true)
     * @Groups({"api"})
     */
    private $commentaire;

    /**
     * @ORM\Column(type="integer", nullable=true)
     */
    private $groupe;

    /**
     * @ORM\ManyToOne(targetEntity=Facture::class, inversedBy="contrats")
     * @ORM\JoinColumn(name="idfacture")
     */
    private $facture;

    /**
     * @ORM\OneToMany(targetEntity=Intervention::class, mappedBy="contrat")
     * @Ignore()
     */
    private $interventions;

    /**
     * @ORM\OneToMany(targetEntity=ContratResiliation::class, mappedBy="contrat", orphanRemoval=true)
     * @Ignore()
     */
    private $contratResiliations;

    /**
     * @ORM\Column(type="boolean", nullable=true,  options={"default" = 1})
     */
    private $dernier_contrat = true;

    /**
     * @ORM\Column(type="boolean", nullable=true,  options={"default" = 0})
     */
    private $contrat_a_venir = false;

    public function __construct()
    {
        $this->interventions = new ArrayCollection();
        $this->contratResiliations = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function setId(?int $id): self
    {
        $this->id = $id;

        return $this;
    }

    public function getEquipement(): ?Equipement
    {
        return $this->equipement;
    }

    public function setEquipement(?Equipement $equipement): self
    {
        $this->equipement = $equipement;

        return $this;
    }

    public function getClient(): ?Client
    {
        return $this->client;
    }

    public function setClient(?Client $client): self
    {
        $this->client = $client;

        return $this;
    }

    public function getContratType(): ?ContratType
    {
        return $this->contrat_type;
    }

    public function setContratType(?ContratType $contrat_type): self
    {
        $this->contrat_type = $contrat_type;

        return $this;
    }

    public function getEdition(): ?bool
    {
        return $this->edition;
    }

    public function setEdition(?bool $edition): self
    {
        $this->edition = $edition;

        return $this;
    }

    public function getCoefficient(): ?float
    {
        return $this->coefficient;
    }

    public function setCoefficient(?float $coefficient): self
    {
        $this->coefficient = $coefficient;

        return $this;
    }

    public function getMontantHt(): ?float
    {
        return $this->montant_ht;
    }

    public function setMontantHt(?float $montant_ht): self
    {
        $this->montant_ht = $montant_ht;

        return $this;
    }

    public function getAgentSouscription(): ?Utilisateur
    {
        return $this->agent_souscription;
    }

    public function setAgentSouscription(?Utilisateur $agent_souscription): self
    {
        $this->agent_souscription = $agent_souscription;

        return $this;
    }

    public function getDateSouscription(): ?\DateTimeInterface
    {
        return $this->date_souscription;
    }

    public function setDateSouscription(?\DateTimeInterface $date_souscription): self
    {
        $this->date_souscription = $date_souscription;

        return $this;
    }

    public function getDateDebutContrat(): ?\DateTimeInterface
    {
        return $this->date_debut_contrat;
    }

    public function setDateDebutContrat(?\DateTimeInterface $date_debut_contrat): self
    {
        $this->date_debut_contrat = $date_debut_contrat;

        return $this;
    }

    public function getDateFinContrat(): ?\DateTimeInterface
    {
        return $this->date_fin_contrat;
    }

    public function setDateFinContrat(?\DateTimeInterface $date_fin_contrat): self
    {
        $this->date_fin_contrat = $date_fin_contrat;

        return $this;
    }

    public function getDateAvisEcheance(): ?\DateTimeInterface
    {
        return $this->date_avis_echeance;
    }

    public function setDateAvisEcheance(?\DateTimeInterface $date_avis_echeance): self
    {
        $this->date_avis_echeance = $date_avis_echeance;

        return $this;
    }

    public function getDatePaiement(): ?\DateTimeInterface
    {
        return $this->date_paiement;
    }

    public function setDatePaiement(?\DateTimeInterface $date_paiement): self
    {
        $this->date_paiement = $date_paiement;

        return $this;
    }

    public function getCommentaire(): ?string
    {
        return $this->commentaire;
    }

    public function setCommentaire(?string $commentaire): self
    {
        $this->commentaire = $commentaire;

        return $this;
    }

    public function getGroupe(): ?int
    {
        return $this->groupe;
    }

    public function setGroupe(?int $groupe): self
    {
        $this->groupe = $groupe;

        return $this;
    }

    public function getFacture(): ?Facture
    {
        return $this->facture;
    }

    public function setFacture(?Facture $facture): self
    {
        $this->facture = $facture;

        return $this;
    }

    /**
     * @return Collection<int, Intervention>
     */
    public function getInterventions(): Collection
    {
        return $this->interventions;
    }

    public function addIntervention(Intervention $intervention): self
    {
        if (!$this->interventions->contains($intervention)) {
            $this->interventions[] = $intervention;
            $intervention->setContrat($this);
        }

        return $this;
    }

    public function removeIntervention(Intervention $intervention): self
    {
        if ($this->interventions->removeElement($intervention)) {
            // set the owning side to null (unless already changed)
            if ($intervention->getContrat() === $this) {
                $intervention->setContrat(null);
            }
        }

        return $this;
    }

    /**
     * @return Collection<int, ContratResiliation>
     */
    public function getContratResiliations(): Collection
    {
        return $this->contratResiliations;
    }

    public function addContratResiliation(ContratResiliation $contratResiliation): self
    {
        if (!$this->contratResiliations->contains($contratResiliation)) {
            $this->contratResiliations[] = $contratResiliation;
            $contratResiliation->setContrat($this);
        }

        return $this;
    }

    public function removeContratResiliation(ContratResiliation $contratResiliation): self
    {
        if ($this->contratResiliations->removeElement($contratResiliation)) {
            // set the owning side to null (unless already changed)
            if ($contratResiliation->getContrat() === $this) {
                $contratResiliation->setContrat(null);
            }
        }

        return $this;
    }

    public function getDernierContrat()
    {
        return $this->dernier_contrat;
    }

    public function setDernierContrat(?bool $dernier_contrat): self
    {
        $this->dernier_contrat = $dernier_contrat;

        return $this;
    }

    public function isContratEchu(): bool
    {
        // 1. Vérifier que l'équipement existe et est sous contrat
        $equipement = $this->getEquipement();
        if (!$equipement) {
            return false;
        }
        $familleContrat = $equipement->getEquipementFamilleContrat();
        if (!$familleContrat || strtolower($familleContrat->getLibelle()) !== 'sous contrat') {
            return false;
        }

        // 2. Vérifier que la date de paiement est vide
        if ($this->getDatePaiement() !== null) {
            return false;
        }

        // 3. Vérifier que la date d'avis d'échéance est dépassée de 4 mois
        $dateAvisEcheance = $this->getDateAvisEcheance();
        if (!$dateAvisEcheance) {
            return false;
        }
        $dateLimite = (new \DateTime())->modify('-4 months');
        if ($dateAvisEcheance > $dateLimite) {
            return false;
        }

        return true;
    }
    public function getContratAvenir()
    {
        return $this->contrat_a_venir;
    }

    public function setContratAvenir(?bool $contrat_a_venir): self
    {
        $this->contrat_a_venir = $contrat_a_venir;

        return $this;
    }
}
