<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\File;

class MakeRepository extends Command
{
    protected $signature = 'make:repository {name}';
    protected $description = 'Create a new repository with interface';

    public function handle()
    {
        $name = $this->argument('name');
        $interfaceName = "{$name}RepositoryInterface";
        $repositoryName = "{$name}Repository";

        // Paths
        $interfacePath = app_path("Repositories/Contracts/{$interfaceName}.php");
        $repositoryPath = app_path("Repositories/Eloquent/{$repositoryName}.php");

        // Make directories if not exist
        if (!File::exists(app_path('Repositories/Contracts'))) {
            File::makeDirectory(app_path('Repositories/Contracts'), 0755, true);
        }
        if (!File::exists(app_path('Repositories/Eloquent'))) {
            File::makeDirectory(app_path('Repositories/Eloquent'), 0755, true);
        }

        // Interface stub
        $interfaceContent = "<?php

namespace App\Repositories\Contracts;

interface {$interfaceName}
{
    public function getAll();
    public function findById(\$id);
    public function create(array \$data);
    public function update(\$id, array \$data);
    public function delete(\$id);
}
";
        File::put($interfacePath, $interfaceContent);

        // Repository stub
        $repositoryContent = "<?php

namespace App\Repositories\Eloquent;

use App\Models\\{$name};
use App\Repositories\Contracts\\{$interfaceName};

class {$repositoryName} implements {$interfaceName}
{
    public function getAll()
    {
        return {$name}::all();
    }

    public function findById(\$id)
    {
        return {$name}::findOrFail(\$id);
    }

    public function create(array \$data)
    {
        return {$name}::create(\$data);
    }

    public function update(\$id, array \$data)
    {
        \$model = {$name}::findOrFail(\$id);
        \$model->update(\$data);
        return \$model;
    }

    public function delete(\$id)
    {
        \$model = {$name}::findOrFail(\$id);
        return \$model->delete();
    }
}";
        File::put($repositoryPath, $repositoryContent);

        $this->info("Repository & Interface for {$name} created successfully!");
    }
}
