<?php

namespace Tests\Unit;

use App\Support\FormTextRules;
use Illuminate\Support\Facades\Validator;
use Tests\TestCase;

class GoalValidationTest extends TestCase
{
    public function test_title_rejects_numeric_only(): void
    {
        $validator = Validator::make(
            ['title' => '12345'],
            ['title' => FormTextRules::notNumericOnly(true, 191)],
            FormTextRules::messages()
        );

        $this->assertTrue($validator->fails());
        $this->assertTrue($validator->errors()->has('title'));
    }

    public function test_team_and_description_reject_numeric_only(): void
    {
        $team = Validator::make(
            ['team' => '999'],
            ['team' => FormTextRules::notNumericOnly(false, 191)],
            FormTextRules::messages()
        );
        $this->assertTrue($team->fails());

        $description = Validator::make(
            ['description' => '42'],
            ['description' => FormTextRules::notNumericOnly(false, 5000)],
            FormTextRules::messages()
        );
        $this->assertTrue($description->fails());
    }

    public function test_owner_department_and_target_are_required(): void
    {
        $validator = Validator::make(
            [
                'user_id' => '',
                'department_id' => '',
                'target' => '',
            ],
            [
                'user_id' => ['required', 'exists:users,id'],
                'department_id' => ['required', 'exists:departments,id'],
                'target' => ['required', 'string', 'max:191'],
            ],
            FormTextRules::messages()
        );

        $this->assertTrue($validator->fails());
        $this->assertTrue($validator->errors()->has('user_id'));
        $this->assertTrue($validator->errors()->has('department_id'));
        $this->assertTrue($validator->errors()->has('target'));
        $this->assertSame('Please select an owner.', $validator->errors()->first('user_id'));
        $this->assertSame('Please select a department.', $validator->errors()->first('department_id'));
        $this->assertSame('Please enter a target.', $validator->errors()->first('target'));
    }

    public function test_numeric_target_is_accepted(): void
    {
        $validator = Validator::make(
            ['target' => '100'],
            ['target' => ['required', 'string', 'max:191']],
            FormTextRules::messages()
        );

        $this->assertFalse($validator->fails(), $validator->errors()->toJson());
    }

    public function test_mixed_title_is_accepted(): void
    {
        $validator = Validator::make(
            ['title' => 'Q1 Sales Goal'],
            ['title' => FormTextRules::notNumericOnly(true, 191)],
            FormTextRules::messages()
        );

        $this->assertFalse($validator->fails(), $validator->errors()->toJson());
    }
}
