<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

/**
 * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Coupon>
 */
class CouponFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition(): array
    {
        $type = fake()->randomElement(['percentage', 'fixed']);
        $value = $type === 'percentage'
            ? fake()->numberBetween(5, 50)
            : fake()->randomFloat(2, 5, 100);

        return [
            'code' => strtoupper(fake()->lexify('??????')),
            'name' => fake()->words(3, true),
            'description' => fake()->sentence(),
            'type' => $type,
            'value' => $value,
            'minimum_amount' => fake()->optional(0.7)->randomFloat(2, 10, 500),
            'max_uses' => fake()->optional(0.6)->numberBetween(10, 1000),
            'uses_count' => 0,
            'max_uses_per_user' => fake()->optional(0.5)->numberBetween(1, 5),
            'starts_at' => fake()->optional(0.3)->dateTimeBetween('-1 week', 'now'),
            'expires_at' => fake()->optional(0.8)->dateTimeBetween('now', '+6 months'),
            'is_active' => true,
            'metadata' => fake()->optional(0.2)->randomElements([
                'created_by_admin' => fake()->boolean(),
                'campaign' => fake()->word(),
                'region' => fake()->countryCode(),
            ]),
        ];
    }

    /**
     * Create a percentage-based coupon
     */
    public function percentage(): static
    {
        return $this->state(fn (array $attributes) => [
            'type' => 'percentage',
            'value' => fake()->numberBetween(5, 50),
        ]);
    }

    /**
     * Create a fixed amount coupon
     */
    public function fixed(): static
    {
        return $this->state(fn (array $attributes) => [
            'type' => 'fixed',
            'value' => fake()->randomFloat(2, 5, 100),
        ]);
    }

    /**
     * Create an expired coupon
     */
    public function expired(): static
    {
        return $this->state(fn (array $attributes) => [
            'expires_at' => fake()->dateTimeBetween('-1 month', '-1 day'),
        ]);
    }

    /**
     * Create an inactive coupon
     */
    public function inactive(): static
    {
        return $this->state(fn (array $attributes) => [
            'is_active' => false,
        ]);
    }

    /**
     * Create a coupon with usage limits
     */
    public function withUsageLimit(): static
    {
        return $this->state(fn (array $attributes) => [
            'max_uses' => fake()->numberBetween(10, 100),
            'max_uses_per_user' => fake()->numberBetween(1, 3),
        ]);
    }

    /**
     * Create a coupon with minimum amount requirement
     */
    public function withMinimumAmount(): static
    {
        return $this->state(fn (array $attributes) => [
            'minimum_amount' => fake()->randomFloat(2, 25, 200),
        ]);
    }
}
