<?php

namespace Tests\Controllers;

use App\Http\Controllers\IssueValidationController;
use Exception;
use PHPUnit\Framework\TestCase;

class IssueValidationControllerTest extends TestCase
{

    protected function setUp(): void
    {
        $this->issue_validation_controller = new IssueValidationController();
    }
    public function testValidDateConversion()
    {
        $this->assertEquals('2024-08-14 00:00:00', $this->issue_validation_controller->date_to_datetime('2024/08/14'));
        $this->assertEquals('2024-12-31 00:00:00', $this->issue_validation_controller->date_to_datetime('2024/12/31'));
    }

    public function testInvalidDateFormat()
    {
        $this->expectException(Exception::class);
        $this->issue_validation_controller->date_to_datetime('invalid-date');
    }

    public function testIssueIsBilled()
    {
        $labels = [['name' => 'RequestBy: User1']];
        $issue_time = [['time' => 3600]]; // 1 hour
        $this->assertTrue($this->issue_validation_controller->check_issue_is_billed($labels, $issue_time));
    }

    public function testIssueIsNotBilledDueToNoTime()
    {
        $labels = [['name' => 'RequestBy: User1']];
        $issue_time = [['time' => 0]];
        $this->assertFalse($this->issue_validation_controller->check_issue_is_billed($labels, $issue_time));
    }

    public function testIssueIsNotBilledDueToNoLabel()
    {
        $labels = [['name' => 'Bug']];
        $issue_time = [['time' => 3600]];
        $this->assertFalse($this->issue_validation_controller->check_issue_is_billed($labels, $issue_time));
    }

    public function testTotalTimeCalculation()
    {
        $issue_time = [['time' => 10], ['time' => 20], ['time' => 30]];
        $this->assertEquals(60, $this->issue_validation_controller->get_issue_total_time($issue_time));
    }

    public function testEmptyTimeArray()
    {
        $issue_time = [];
        $this->assertEquals(0, $this->issue_validation_controller->get_issue_total_time($issue_time));
    }

    public function testSingleTimeEntry()
    {
        $issue_time = [['time' => 15]];
        $this->assertEquals(15, $this->issue_validation_controller->get_issue_total_time($issue_time));
    }

    public function testIssueWithinDateRangeAndBilled()
    {
        $issue = ['closed_at' => '2024-08-15T10:00:00Z', 'labels' => [['name' => 'RequestBy: User1']]];
        $issue_time = [['time' => 3600]]; // 1 hour
        $this->assertTrue($this->issue_validation_controller->handle_single_issue('2024-08-14', '2024-08-16', $issue, $issue_time));
    }

    public function testIssueOutsideDateRange()
    {
        $issue = ['closed_at' => '2024-08-13T10:00:00Z', 'labels' => [['name' => 'RequestBy: User1']]];
        $issue_time = [['time' => 3600]];
        $this->assertFalse($this->issue_validation_controller->handle_single_issue('2024-08-14', '2024-08-16', $issue, $issue_time));
    }

    public function testIssueNotBilled()
    {
        $issue = ['closed_at' => '2024-08-15T10:00:00Z', 'labels' => [['name' => 'Bug']]];
        $issue_time = [['time' => 0]];
        $this->assertFalse($this->issue_validation_controller->handle_single_issue('2024-08-14', '2024-08-16', $issue, $issue_time));
    }

    public function testLabelExists()
    {
        $labels = [['name' => 'RequestBy: User1'], ['name' => 'Bug']];
        $this->assertTrue($this->issue_validation_controller->search_requested_by($labels));
    }

    public function testLabelDoesNotExist()
    {
        $labels = [['name' => 'Bug'], ['name' => 'Feature']];
        $this->assertFalse($this->issue_validation_controller->search_requested_by($labels));
    }

    public function testEmptyLabels()
    {
        $labels = [];
        $this->assertFalse($this->issue_validation_controller->search_requested_by($labels));
    }
}