<?php

namespace App\Tests\Entity;

use App\Entity\Place;
use App\Entity\Stats;
use PHPUnit\Framework\TestCase;

class StatsTest extends TestCase
{
    public function testComputeCompletionPercentWithPerfectPlace()
    {
        // Créer un objet Stats
        $stats = new Stats();
        $stats->setZone('12345');

        // Créer un lieu avec une complétion parfaite (100%)
        $perfectPlace = new Place();
        $perfectPlace->setName('Restaurant Test')
            ->setHasAddress(true)
            ->setHasWebsite(true)
            ->setHasWheelchair(true)
            ->setHasOpeningHours(true)
            ->setSiret('12345678901234')
            ->setNoteContent('Note de test'); // Les notes ne comptent pas dans la complétion

        // Ajouter le lieu aux stats
        $stats->addPlace($perfectPlace);

        // Calculer le pourcentage de complétion
        $completionPercent = $stats->computeCompletionPercent();

        // Vérifier que le résultat est 100%
        $this->assertEquals(100, $completionPercent);
        
        // Vérifier que les compteurs sont corrects
        $this->assertEquals(1, $stats->getAvecAdresse());
        $this->assertEquals(1, $stats->getAvecSite());
        $this->assertEquals(1, $stats->getAvecAccessibilite());
        $this->assertEquals(1, $stats->getAvecHoraires());
        $this->assertEquals(1, $stats->getAvecSiret());
        $this->assertEquals(1, $stats->getAvecName());
        $this->assertEquals(1, $stats->getAvecNote());
    }

    public function testComputeCompletionPercentWithPartialPlace()
    {
        // Créer un objet Stats
        $stats = new Stats();
        $stats->setZone('12345');

        // Créer un lieu avec une complétion partielle (67% - 4 critères sur 6)
        $partialPlace = new Place();
        $partialPlace->setName('Café Test')
            ->setHasAddress(true)      // ✓
            ->setHasWebsite(false)     // ✗
            ->setHasWheelchair(true)   // ✓
            ->setHasOpeningHours(false) // ✗
            ->setSiret('12345678901234') // ✓
            ->setNoteContent('Note de test'); // Les notes ne comptent pas

        // Ajouter le lieu aux stats
        $stats->addPlace($partialPlace);

        // Calculer le pourcentage de complétion
        $completionPercent = $stats->computeCompletionPercent();

        // Vérifier que le résultat est 67% (4/6 * 100)
        $this->assertEquals(67, $completionPercent);
        
        // Vérifier que les compteurs sont corrects
        $this->assertEquals(1, $stats->getAvecAdresse());
        $this->assertEquals(0, $stats->getAvecSite());
        $this->assertEquals(1, $stats->getAvecAccessibilite());
        $this->assertEquals(0, $stats->getAvecHoraires());
        $this->assertEquals(1, $stats->getAvecSiret());
        $this->assertEquals(1, $stats->getAvecName());
        $this->assertEquals(1, $stats->getAvecNote());
    }

    public function testComputeCompletionPercentWithEmptyPlace()
    {
        // Créer un objet Stats
        $stats = new Stats();
        $stats->setZone('12345');

        // Créer un lieu avec aucune complétion (0%)
        $emptyPlace = new Place();
        $emptyPlace->setName(null)
            ->setHasAddress(false)
            ->setHasWebsite(false)
            ->setHasWheelchair(false)
            ->setHasOpeningHours(false)
            ->setSiret(null)
            ->setNoteContent(null);

        // Ajouter le lieu aux stats
        $stats->addPlace($emptyPlace);

        // Calculer le pourcentage de complétion
        $completionPercent = $stats->computeCompletionPercent();

        // Vérifier que le résultat est 0%
        $this->assertEquals(0, $completionPercent);
        
        // Vérifier que les compteurs sont corrects
        $this->assertEquals(0, $stats->getAvecAdresse());
        $this->assertEquals(0, $stats->getAvecSite());
        $this->assertEquals(0, $stats->getAvecAccessibilite());
        $this->assertEquals(0, $stats->getAvecHoraires());
        $this->assertEquals(0, $stats->getAvecSiret());
        $this->assertEquals(0, $stats->getAvecName());
        $this->assertEquals(0, $stats->getAvecNote());
    }

    public function testComputeCompletionPercentWithMultiplePlaces()
    {
        // Créer un objet Stats
        $stats = new Stats();
        $stats->setZone('12345');

        // Créer un lieu parfait (100%)
        $perfectPlace = new Place();
        $perfectPlace->setName('Restaurant Parfait')
            ->setHasAddress(true)
            ->setHasWebsite(true)
            ->setHasWheelchair(true)
            ->setHasOpeningHours(true)
            ->setSiret('12345678901234');

        // Créer un lieu vide (0%)
        $emptyPlace = new Place();
        $emptyPlace->setName(null)
            ->setHasAddress(false)
            ->setHasWebsite(false)
            ->setHasWheelchair(false)
            ->setHasOpeningHours(false)
            ->setSiret(null);

        // Ajouter les lieux aux stats
        $stats->addPlace($perfectPlace);
        $stats->addPlace($emptyPlace);

        // Calculer le pourcentage de complétion
        $completionPercent = $stats->computeCompletionPercent();

        // Vérifier que le résultat est 50% (moyenne de 100% et 0%)
        $this->assertEquals(50, $completionPercent);
        
        // Vérifier que les compteurs sont corrects
        $this->assertEquals(1, $stats->getAvecAdresse());
        $this->assertEquals(1, $stats->getAvecSite());
        $this->assertEquals(1, $stats->getAvecAccessibilite());
        $this->assertEquals(1, $stats->getAvecHoraires());
        $this->assertEquals(1, $stats->getAvecSiret());
        $this->assertEquals(1, $stats->getAvecName());
        $this->assertEquals(0, $stats->getAvecNote());
    }

    public function testComputeCompletionPercentWithNoPlaces()
    {
        // Créer un objet Stats sans lieux
        $stats = new Stats();
        $stats->setZone('12345');

        // Calculer le pourcentage de complétion
        $completionPercent = $stats->computeCompletionPercent();

        // Vérifier que le résultat est 0%
        $this->assertEquals(0, $completionPercent);
        
        // Vérifier que les compteurs sont corrects
        $this->assertEquals(0, $stats->getAvecAdresse());
        $this->assertEquals(0, $stats->getAvecSite());
        $this->assertEquals(0, $stats->getAvecAccessibilite());
        $this->assertEquals(0, $stats->getAvecHoraires());
        $this->assertEquals(0, $stats->getAvecSiret());
        $this->assertEquals(0, $stats->getAvecName());
        $this->assertEquals(0, $stats->getAvecNote());
    }

    public function testNotesDoNotCountInCompletion()
    {
        // Créer un objet Stats
        $stats = new Stats();
        $stats->setZone('12345');

        // Créer un lieu avec seulement des notes (0% de complétion)
        $placeWithNotes = new Place();
        $placeWithNotes->setName(null)
            ->setHasAddress(false)
            ->setHasWebsite(false)
            ->setHasWheelchair(false)
            ->setHasOpeningHours(false)
            ->setSiret(null)
            ->setNoteContent('Note importante')
            ->setHasNote(true);

        // Ajouter le lieu aux stats
        $stats->addPlace($placeWithNotes);

        // Calculer le pourcentage de complétion
        $completionPercent = $stats->computeCompletionPercent();

        // Vérifier que le résultat est 0% (les notes ne comptent pas)
        $this->assertEquals(0, $completionPercent);
        
        // Vérifier que les compteurs sont corrects
        $this->assertEquals(0, $stats->getAvecAdresse());
        $this->assertEquals(0, $stats->getAvecSite());
        $this->assertEquals(0, $stats->getAvecAccessibilite());
        $this->assertEquals(0, $stats->getAvecHoraires());
        $this->assertEquals(0, $stats->getAvecSiret());
        $this->assertEquals(0, $stats->getAvecName());
        $this->assertEquals(1, $stats->getAvecNote()); // Les notes sont comptées séparément
    }
} 