<?php
/**
 * Signal Career Compass - Laravel File Generator
 * Creates all remaining migrations, models, middleware, controllers, and routes
 * Run with: php generate_files.php
 */

$base = __DIR__;

function writeFile($path, $content) {
    global $base;
    $full = $base . '/' . $path;
    $dir = dirname($full);
    if (!is_dir($dir)) mkdir($dir, 0777, true);
    file_put_contents($full, $content);
    echo "Created: $path\n";
}

// ==========================================
// MIGRATIONS 5-19
// ==========================================

writeFile('database/migrations/2026_08_08_000005_create_candidates_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'candidates\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'user_id\')->constrained()->cascadeOnDelete();
            $table->json(\'skills\')->nullable();
            $table->json(\'experience\')->nullable();
            $table->text(\'education\')->nullable();
            $table->text(\'summary\')->nullable();
            $table->text(\'about_me\')->nullable();
            $table->text(\'avatar\')->nullable();
            $table->string(\'expected_salary\')->nullable();
            $table->string(\'preferred_work_arrangement\')->nullable();
            $table->string(\'stage\')->default(\'applied\');
            $table->string(\'hired_organization\')->nullable();
            $table->boolean(\'banned\')->default(false);
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'candidates\'); }
};');

writeFile('database/migrations/2026_08_08_000006_create_onboarding_records_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'onboarding_records\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'user_id\')->nullable()->constrained()->nullOnDelete();
            $table->foreignId(\'tenant_id\')->nullable()->constrained()->nullOnDelete();
            $table->string(\'employee_id\')->nullable();
            $table->string(\'name\');
            $table->string(\'email\');
            $table->string(\'phone\')->nullable();
            $table->string(\'department\')->nullable();
            $table->string(\'designation\')->nullable();
            $table->date(\'joining_date\')->nullable();
            $table->enum(\'status\', [\'Pending\', \'Active\', \'Completed\'])->default(\'Active\');
            $table->integer(\'progress\')->default(0);
            $table->json(\'documents\')->nullable();
            $table->json(\'video_progress\')->nullable();
            $table->json(\'checklist_progress\')->nullable();
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'onboarding_records\'); }
};');

writeFile('database/migrations/2026_08_08_000007_create_training_videos_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'training_videos\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'tenant_id\')->constrained()->cascadeOnDelete();
            $table->string(\'title\');
            $table->text(\'url\');
            $table->string(\'duration\')->nullable();
            $table->string(\'department\')->nullable();
            $table->json(\'assigned_employee_ids\')->nullable();
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'training_videos\'); }
};');

writeFile('database/migrations/2026_08_08_000008_create_onboarding_checklists_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'onboarding_checklists\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'tenant_id\')->constrained()->cascadeOnDelete();
            $table->string(\'title\');
            $table->string(\'department\')->nullable();
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'onboarding_checklists\'); }
};');

writeFile('database/migrations/2026_08_08_000009_create_courses_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'courses\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'tenant_id\')->nullable()->constrained()->nullOnDelete();
            $table->string(\'title\');
            $table->string(\'provider\')->nullable();
            $table->string(\'duration\')->nullable();
            $table->json(\'skills\')->nullable();
            $table->string(\'level\')->default(\'Beginner\');
            $table->text(\'description\')->nullable();
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'courses\'); }
};');

writeFile('database/migrations/2026_08_08_000010_create_universities_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'universities\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'tenant_id\')->nullable()->constrained()->nullOnDelete();
            $table->string(\'name\');
            $table->text(\'logo\')->nullable();
            $table->integer(\'courses_count\')->default(0);
            $table->string(\'sync_status\')->default(\'Disconnected\');
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'universities\'); }
};');

writeFile('database/migrations/2026_08_08_000011_create_conversations_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'conversations\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'participant_1_id\')->constrained(\'users\')->cascadeOnDelete();
            $table->foreignId(\'participant_2_id\')->constrained(\'users\')->cascadeOnDelete();
            $table->string(\'name\')->nullable();
            $table->string(\'avatar_initials\')->nullable();
            $table->string(\'avatar_color\')->nullable();
            $table->text(\'avatar_url\')->nullable();
            $table->string(\'applicant_name\')->nullable();
            $table->string(\'applicant_email\')->nullable();
            $table->string(\'recruiter_name\')->nullable();
            $table->string(\'company_name\')->nullable();
            $table->text(\'last_message\')->nullable();
            $table->timestamp(\'last_message_at\')->nullable();
            $table->integer(\'unread_count\')->default(0);
            $table->foreignId(\'tenant_id\')->nullable()->constrained()->nullOnDelete();
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'conversations\'); }
};');

writeFile('database/migrations/2026_08_08_000012_create_messages_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'messages\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'conversation_id\')->constrained()->cascadeOnDelete();
            $table->foreignId(\'sender_id\')->constrained(\'users\')->cascadeOnDelete();
            $table->string(\'sender_name\')->nullable();
            $table->string(\'sender_email\')->nullable();
            $table->text(\'sender_avatar_url\')->nullable();
            $table->text(\'text\')->nullable();
            $table->json(\'attachments\')->nullable();
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'messages\'); }
};');

writeFile('database/migrations/2026_08_08_000013_create_social_posts_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'social_posts\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'user_id\')->constrained()->cascadeOnDelete();
            $table->foreignId(\'tenant_id\')->nullable()->constrained()->nullOnDelete();
            $table->text(\'text\');
            $table->json(\'tags\')->nullable();
            $table->json(\'media\')->nullable();
            $table->json(\'likes\')->nullable();
            $table->json(\'saved_by\')->nullable();
            $table->json(\'reports\')->nullable();
            $table->integer(\'shares\')->default(0);
            $table->string(\'author_name\')->nullable();
            $table->string(\'author_email\')->nullable();
            $table->enum(\'author_type\', [\'organization\', \'seeker\'])->default(\'seeker\');
            $table->string(\'organization_name\')->nullable();
            $table->string(\'visibility\')->default(\'public\');
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'social_posts\'); }
};');

writeFile('database/migrations/2026_08_08_000014_create_social_comments_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'social_comments\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'social_post_id\')->constrained()->cascadeOnDelete();
            $table->foreignId(\'user_id\')->constrained()->cascadeOnDelete();
            $table->unsignedBigInteger(\'parent_id\')->nullable();
            $table->text(\'text\');
            $table->timestamps();
            $table->foreign(\'parent_id\')->references(\'id\')->on(\'social_comments\')->nullOnDelete();
        });
    }
    public function down(): void { Schema::dropIfExists(\'social_comments\'); }
};');

writeFile('database/migrations/2026_08_08_000015_create_custom_roles_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'custom_roles\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'tenant_id\')->constrained()->cascadeOnDelete();
            $table->string(\'name\');
            $table->text(\'description\')->nullable();
            $table->json(\'permissions\')->nullable();
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'custom_roles\'); }
};');

writeFile('database/migrations/2026_08_08_000016_create_departments_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'departments\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'tenant_id\')->constrained()->cascadeOnDelete();
            $table->string(\'name\');
            $table->string(\'code\')->nullable();
            $table->text(\'description\')->nullable();
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'departments\'); }
};');

writeFile('database/migrations/2026_08_08_000017_create_franchise_lifecycles_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'franchise_lifecycles\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'tenant_id\')->nullable()->constrained()->nullOnDelete();
            $table->string(\'candidate_email\');
            $table->integer(\'phase\')->default(1);
            $table->string(\'stage\')->default(\'APPLICATION_SUBMITTED\');
            $table->json(\'milestones\')->nullable();
            $table->text(\'territory_counties\')->nullable();
            $table->text(\'notes\')->nullable();
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'franchise_lifecycles\'); }
};');

writeFile('database/migrations/2026_08_08_000018_create_notifications_custom_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'notifications_custom\', function (Blueprint $table) {
            $table->id();
            $table->foreignId(\'user_id\')->constrained()->cascadeOnDelete();
            $table->string(\'title\');
            $table->text(\'message\')->nullable();
            $table->string(\'type\')->default(\'info\');
            $table->boolean(\'read\')->default(false);
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'notifications_custom\'); }
};');

writeFile('database/migrations/2026_08_08_000019_create_settings_table.php', '<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void {
        Schema::create(\'settings\', function (Blueprint $table) {
            $table->id();
            $table->string(\'key\')->unique();
            $table->text(\'value\')->nullable();
            $table->timestamps();
        });
    }
    public function down(): void { Schema::dropIfExists(\'settings\'); }
};');

// ==========================================
// MODELS
// ==========================================

writeFile('app/Models/User.php', '<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use HasFactory, Notifiable;
    protected $fillable = [\'name\', \'email\', \'password\', \'role\', \'tenant_id\', \'avatar_url\', \'phone\', \'title\', \'location\'];
    protected $hidden = [\'password\', \'remember_token\'];
    protected function casts(): array {
        return [\'email_verified_at\' => \'datetime\', \'password\' => \'hashed\'];
    }
    public function tenant() { return $this->belongsTo(Tenant::class); }
    public function candidate() { return $this->hasOne(Candidate::class); }
    public function applications() { return $this->hasMany(Application::class); }
    public function onboardingRecord() { return $this->hasOne(OnboardingRecord::class); }
    public function isSuperAdmin() { return $this->role === \'super-admin\'; }
    public function isTenantAdmin() { return $this->role === \'tenant-admin\'; }
    public function isRecruiter() { return $this->role === \'recruiter\'; }
    public function isSeeker() { return $this->role === \'seeker\'; }
    public function isHiredEmployee() { return $this->applications()->where(\'status\', \'Hired\')->exists(); }
    public function getDefaultRoute() {
        return match($this->role) {
            \'super-admin\' => \'admin.control-center\',
            \'tenant-admin\' => \'enterprise.dashboard\',
            \'recruiter\' => \'enterprise.applications\',
            \'seeker\' => \'seeker.job-feed\',
            default => \'landing\',
        };
    }
}');

$models = [
    ['Tenant', 'tenant_id', '[\'name\', \'domain\', \'owner_name\', \'owner_email\', \'admin_email\', \'theme_color\', \'sidebar_color\', \'logo_url\', \'status\', \'license_tier\', \'royalty_rate\', \'monthly_billing\', \'password\', \'features\', \'company_profile\']', '[\'features\' => \'array\', \'company_profile\' => \'array\']', 'public function users() { return $this->hasMany(User::class); }
    public function jobs() { return $this->hasMany(JobPosting::class); }
    public function applications() { return $this->hasMany(Application::class); }
    public function departments() { return $this->hasMany(Department::class); }
    public function customRoles() { return $this->hasMany(CustomRole::class); }'],
    ['JobPosting', 'tenant_id', '[\'tenant_id\', \'title\', \'location\', \'company\', \'salary\', \'description\', \'requirements\', \'status\', \'views\', \'applicants_count\', \'posted_at\', \'franchise_logo\']', '[\'requirements\' => \'array\', \'posted_at\' => \'date\']', 'public function tenant() { return $this->belongsTo(Tenant::class); }
    public function applications() { return $this->hasMany(Application::class); }'],
    ['Application', 'tenant_id', '[\'job_posting_id\', \'user_id\', \'tenant_id\', \'applicant_name\', \'applicant_email\', \'applicant_phone\', \'applicant_avatar_url\', \'applicant_title\', \'applicant_location\', \'applicant_summary\', \'applicant_skills\', \'resume_url\', \'resume_file_name\', \'experience_summary\', \'custom_answer\', \'custom_answers\', \'company\', \'status\', \'applied_date\', \'match_score\', \'owner_approved\', \'owner_approved_by\', \'owner_approved_at\']', '[\'applicant_skills\' => \'array\', \'custom_answers\' => \'array\', \'applied_date\' => \'date\']', 'public function jobPosting() { return $this->belongsTo(JobPosting::class); }
    public function user() { return $this->belongsTo(User::class); }
    public function tenant() { return $this->belongsTo(Tenant::class); }'],
    ['Candidate', 'user_id', '[\'user_id\', \'skills\', \'experience\', \'education\', \'summary\', \'about_me\', \'avatar\', \'expected_salary\', \'preferred_work_arrangement\', \'stage\', \'hired_organization\', \'banned\']', '[\'skills\' => \'array\', \'experience\' => \'array\']', 'public function user() { return $this->belongsTo(User::class); }'],
    ['OnboardingRecord', 'tenant_id', '[\'user_id\', \'tenant_id\', \'employee_id\', \'name\', \'email\', \'phone\', \'department\', \'designation\', \'joining_date\', \'status\', \'progress\', \'documents\', \'video_progress\', \'checklist_progress\']', '[\'documents\' => \'array\', \'video_progress\' => \'array\', \'checklist_progress\' => \'array\', \'joining_date\' => \'date\']', 'public function user() { return $this->belongsTo(User::class); }
    public function tenant() { return $this->belongsTo(Tenant::class); }'],
    ['TrainingVideo', 'tenant_id', '[\'tenant_id\', \'title\', \'url\', \'duration\', \'department\', \'assigned_employee_ids\']', '[\'assigned_employee_ids\' => \'array\']', 'public function tenant() { return $this->belongsTo(Tenant::class); }'],
    ['OnboardingChecklist', 'tenant_id', '[\'tenant_id\', \'title\', \'department\']', '[]', 'public function tenant() { return $this->belongsTo(Tenant::class); }'],
    ['Course', 'tenant_id', '[\'tenant_id\', \'title\', \'provider\', \'duration\', \'skills\', \'level\', \'description\']', '[\'skills\' => \'array\']', 'public function tenant() { return $this->belongsTo(Tenant::class); }'],
    ['University', 'tenant_id', '[\'tenant_id\', \'name\', \'logo\', \'courses_count\', \'sync_status\']', '[]', 'public function tenant() { return $this->belongsTo(Tenant::class); }'],
    ['Conversation', null, '[\'participant_1_id\', \'participant_2_id\', \'name\', \'avatar_initials\', \'avatar_color\', \'avatar_url\', \'applicant_name\', \'applicant_email\', \'recruiter_name\', \'company_name\', \'last_message\', \'last_message_at\', \'unread_count\', \'tenant_id\']', '[\'last_message_at\' => \'datetime\']', 'public function participant1() { return $this->belongsTo(User::class, \'participant_1_id\'); }
    public function participant2() { return $this->belongsTo(User::class, \'participant_2_id\'); }
    public function messages() { return $this->hasMany(Message::class); }'],
    ['Message', null, '[\'conversation_id\', \'sender_id\', \'sender_name\', \'sender_email\', \'sender_avatar_url\', \'text\', \'attachments\']', '[\'attachments\' => \'array\']', 'public function conversation() { return $this->belongsTo(Conversation::class); }
    public function sender() { return $this->belongsTo(User::class, \'sender_id\'); }'],
    ['SocialPost', null, '[\'user_id\', \'tenant_id\', \'text\', \'tags\', \'media\', \'likes\', \'saved_by\', \'reports\', \'shares\', \'author_name\', \'author_email\', \'author_type\', \'organization_name\', \'visibility\']', '[\'tags\' => \'array\', \'media\' => \'array\', \'likes\' => \'array\', \'saved_by\' => \'array\', \'reports\' => \'array\']', 'public function user() { return $this->belongsTo(User::class); }
    public function comments() { return $this->hasMany(SocialComment::class); }'],
    ['SocialComment', null, '[\'social_post_id\', \'user_id\', \'parent_id\', \'text\']', '[]', 'public function socialPost() { return $this->belongsTo(SocialPost::class); }
    public function user() { return $this->belongsTo(User::class); }
    public function parent() { return $this->belongsTo(SocialComment::class, \'parent_id\'); }
    public function replies() { return $this->hasMany(SocialComment::class, \'parent_id\'); }'],
    ['CustomRole', 'tenant_id', '[\'tenant_id\', \'name\', \'description\', \'permissions\']', '[\'permissions\' => \'array\']', 'public function tenant() { return $this->belongsTo(Tenant::class); }'],
    ['Department', 'tenant_id', '[\'tenant_id\', \'name\', \'code\', \'description\']', '[]', 'public function tenant() { return $this->belongsTo(Tenant::class); }'],
    ['FranchiseLifecycle', 'tenant_id', '[\'tenant_id\', \'candidate_email\', \'phase\', \'stage\', \'milestones\', \'territory_counties\', \'notes\']', '[\'milestones\' => \'array\']', 'public function tenant() { return $this->belongsTo(Tenant::class); }'],
    ['Setting', null, '[\'key\', \'value\']', '[]', ''],
];

foreach ($models as $m) {
    $name = $m[0];
    $fillable = $m[2];
    $casts = $m[3];
    $rels = $m[4];
    $castsLine = $casts !== '[]' ? "\n    protected \$casts = $casts;" : '';
    $table = $name === 'Setting' ? "\n    protected \$table = 'settings';" : '';
    if ($name === 'AppNotification') {
        $table = "\n    protected \$table = 'notifications_custom';";
    }

    writeFile("app/Models/$name.php", "<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class $name extends Model
{
    use HasFactory;
    protected \$fillable = $fillable;$castsLine$table
    $rels
}");
}

// AppNotification (separate from Laravel's Notification)
writeFile('app/Models/AppNotification.php', '<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;

class AppNotification extends Model
{
    use HasFactory;
    protected $table = \'notifications_custom\';
    protected $fillable = [\'user_id\', \'title\', \'message\', \'type\', \'read\'];
    public function user() { return $this->belongsTo(User::class); }
}');

// ==========================================
// MIDDLEWARE
// ==========================================

writeFile('app/Http/Middleware/RoleMiddleware.php', '<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class RoleMiddleware
{
    public function handle(Request $request, Closure $next, ...$roles): Response
    {
        if (!auth()->check()) {
            return redirect()->route(\'login\');
        }
        if (!in_array(auth()->user()->role, $roles)) {
            abort(403, \'Unauthorized\');
        }
        return $next($request);
    }
}');

// ==========================================
// AUTH CONTROLLER
// ==========================================

writeFile('app/Http/Controllers/Auth/AuthController.php', '<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\Candidate;
use App\Models\Tenant;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    public function showLogin() { return view(\'auth.login\'); }

    public function login(Request $request)
    {
        $request->validate([\'email\' => \'required|email\', \'password\' => \'required\']);
        if (Auth::attempt($request->only(\'email\', \'password\'), $request->filled(\'remember\'))) {
            $request->session()->regenerate();
            return redirect()->route(Auth::user()->getDefaultRoute());
        }
        return back()->withErrors([\'email\' => \'Invalid credentials.\'])->onlyInput(\'email\');
    }

    public function showRegister() { return view(\'auth.register\'); }

    public function register(Request $request)
    {
        $request->validate([
            \'name\' => \'required|string|max:255\',
            \'email\' => \'required|email|unique:users\',
            \'password\' => \'required|confirmed|min:6\',
            \'role\' => \'required|in:seeker,tenant-admin\',
        ]);
        $user = User::create([
            \'name\' => $request->name,
            \'email\' => $request->email,
            \'password\' => $request->password,
            \'role\' => $request->role,
        ]);
        if ($request->role === \'seeker\') {
            Candidate::create([\'user_id\' => $user->id]);
        }
        if ($request->role === \'tenant-admin\' && $request->filled(\'organization_name\')) {
            $tenant = Tenant::create([
                \'name\' => $request->organization_name,
                \'domain\' => $request->organization_domain,
                \'owner_name\' => $request->name,
                \'owner_email\' => $request->email,
                \'admin_email\' => $request->email,
                \'status\' => \'Active\',
            ]);
            $user->update([\'tenant_id\' => $tenant->id]);
        }
        Auth::login($user);
        return redirect()->route($user->getDefaultRoute());
    }

    public function logout(Request $request)
    {
        Auth::logout();
        $request->session()->invalidate();
        $request->session()->regenerateToken();
        return redirect()->route(\'landing\');
    }
}');

// ==========================================
// STUB CONTROLLERS
// ==========================================

writeFile('app/Http/Controllers/PublicController.php', '<?php
namespace App\Http\Controllers;
class PublicController extends Controller
{
    public function landing() { return view(\'public.landing\'); }
}');

// Admin
writeFile('app/Http/Controllers/Admin/SuperAdminController.php', '<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
class SuperAdminController extends Controller
{
    public function index() { return view(\'placeholder\', [\'pageTitle\' => \'Global Control Center\', \'pageIcon\' => \'🛡️\']); }
}');

// Enterprise Controllers
$entControllers = [
    ['TenantStudioController', 'Enterprise Studio', '🎨'],
    ['EntApplicationController', 'Applications Inbox', '📥', true],
    ['EntJobController', 'Job Management', '📋', false, true],
    ['SourcingController', 'Candidate Sourcing', '🔍'],
    ['PipelineController', 'Recruitment Pipeline', '🔀'],
    ['EntDashboardController', 'Analytics Dashboard', '📊'],
    ['EntOnboardingController', 'Employee Onboarding', '✅'],
    ['RoleController', 'Roles & Access', '🔐'],
    ['EntCompanyProfileController', 'Company Profile', '🏢'],
    ['WorkforceController', 'Workforce Planning', '📈'],
    ['MatchingController', 'Matching Engine', '🧠'],
    ['EntCourseController', 'Course Studio', '🎓'],
    ['EntUniversityController', 'University Connector', '🔗'],
    ['FranchiseController', 'Franchise Portal', '🏪'],
];

foreach ($entControllers as $c) {
    $name = $c[0];
    $title = $c[1];
    $icon = $c[2];
    $hasUpdateStatus = $c[3] ?? false;
    $hasJobCrud = $c[4] ?? false;

    $extra = '';
    if ($hasUpdateStatus) {
        $extra = '
    public function updateStatus(\Illuminate\Http\Request $request, $id) { return redirect()->route(\'enterprise.applications\'); }';
    }
    if ($hasJobCrud) {
        $extra = '
    public function create() { return view(\'placeholder\', [\'pageTitle\' => \'Create Job Post\', \'pageIcon\' => \'✏️\']); }
    public function store(\Illuminate\Http\Request $request) { return redirect()->route(\'enterprise.jobs\'); }
    public function edit($id) { return view(\'placeholder\', [\'pageTitle\' => \'Edit Job Post\', \'pageIcon\' => \'✏️\']); }
    public function update(\Illuminate\Http\Request $request, $id) { return redirect()->route(\'enterprise.jobs\'); }';
    }

    writeFile("app/Http/Controllers/Enterprise/$name.php", "<?php
namespace App\Http\Controllers\Enterprise;
use App\Http\Controllers\Controller;
class $name extends Controller
{
    public function index() { return view('placeholder', ['pageTitle' => '$title', 'pageIcon' => '$icon']); }$extra
}");
}

// Seeker Controllers
$seekerControllers = [
    ['JobFeedController', 'AI Job Feed', '🔍'],
    ['JobMapController', 'Job Location Map', '🗺️'],
    ['SeekerApplicationController', 'My Applications', '📋'],
    ['SeekerOnboardingController', 'My Onboarding', '✅'],
    ['SeekerProfileController', 'My Profile', '👤', true],
    ['ResumeController', 'AI Resume Builder', '📄'],
    ['InterviewController', 'Mock Interview AI', '🎙️'],
    ['TrainingController', 'Learning Hub', '🎓'],
    ['AcademicController', 'Academic Track', '🏫'],
    ['CompanyDirectoryController', 'Company Directory', '🏢'],
];

foreach ($seekerControllers as $c) {
    $name = $c[0];
    $title = $c[1];
    $icon = $c[2];
    $hasUpdate = $c[3] ?? false;

    $extra = $hasUpdate ? '
    public function update(\Illuminate\Http\Request $request) { return redirect()->route(\'seeker.profile\'); }' : '';

    writeFile("app/Http/Controllers/Seeker/$name.php", "<?php
namespace App\Http\Controllers\Seeker;
use App\Http\Controllers\Controller;
class $name extends Controller
{
    public function index() { return view('placeholder', ['pageTitle' => '$title', 'pageIcon' => '$icon']); }$extra
}");
}

// Shared Controllers
$sharedControllers = [
    ['MessageController', 'Messages', '💬'],
    ['SocialFeedController', 'Social Feed', '👥'],
    ['AiCoachController', 'AI Career Coach', '🤖'],
    ['SettingsController', 'Settings', '⚙️'],
];

foreach ($sharedControllers as $c) {
    writeFile("app/Http/Controllers/Shared/{$c[0]}.php", "<?php
namespace App\Http\Controllers\Shared;
use App\Http\Controllers\Controller;
class {$c[0]} extends Controller
{
    public function index() { return view('placeholder', ['pageTitle' => '{$c[1]}', 'pageIcon' => '{$c[2]}']); }
}");
}

// ==========================================
// ROUTES
// ==========================================

writeFile('routes/web.php', '<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\AuthController;
use App\Http\Controllers\PublicController;
use App\Http\Controllers\Admin\SuperAdminController;
use App\Http\Controllers\Enterprise\TenantStudioController;
use App\Http\Controllers\Enterprise\EntApplicationController;
use App\Http\Controllers\Enterprise\EntJobController;
use App\Http\Controllers\Enterprise\SourcingController;
use App\Http\Controllers\Enterprise\PipelineController;
use App\Http\Controllers\Enterprise\EntDashboardController;
use App\Http\Controllers\Enterprise\EntOnboardingController;
use App\Http\Controllers\Enterprise\RoleController;
use App\Http\Controllers\Enterprise\EntCompanyProfileController;
use App\Http\Controllers\Enterprise\WorkforceController;
use App\Http\Controllers\Enterprise\MatchingController;
use App\Http\Controllers\Enterprise\EntCourseController;
use App\Http\Controllers\Enterprise\EntUniversityController;
use App\Http\Controllers\Enterprise\FranchiseController;
use App\Http\Controllers\Seeker\JobFeedController;
use App\Http\Controllers\Seeker\JobMapController;
use App\Http\Controllers\Seeker\SeekerApplicationController;
use App\Http\Controllers\Seeker\SeekerOnboardingController;
use App\Http\Controllers\Seeker\SeekerProfileController;
use App\Http\Controllers\Seeker\ResumeController;
use App\Http\Controllers\Seeker\InterviewController;
use App\Http\Controllers\Seeker\TrainingController;
use App\Http\Controllers\Seeker\AcademicController;
use App\Http\Controllers\Seeker\CompanyDirectoryController;
use App\Http\Controllers\Shared\MessageController;
use App\Http\Controllers\Shared\SocialFeedController;
use App\Http\Controllers\Shared\AiCoachController;
use App\Http\Controllers\Shared\SettingsController;

// Public
Route::get(\'/\', [PublicController::class, \'landing\'])->name(\'landing\');

// Auth
Route::middleware(\'guest\')->group(function () {
    Route::get(\'/login\', [AuthController::class, \'showLogin\'])->name(\'login\');
    Route::post(\'/login\', [AuthController::class, \'login\']);
    Route::get(\'/register\', [AuthController::class, \'showRegister\'])->name(\'register\');
    Route::post(\'/register\', [AuthController::class, \'register\']);
});
Route::post(\'/logout\', [AuthController::class, \'logout\'])->name(\'logout\')->middleware(\'auth\');

// Super Admin
Route::middleware([\'auth\', \'role:super-admin\'])->prefix(\'admin\')->name(\'admin.\')->group(function () {
    Route::get(\'/control-center\', [SuperAdminController::class, \'index\'])->name(\'control-center\');
});

// Enterprise
Route::middleware([\'auth\', \'role:tenant-admin,recruiter\'])->prefix(\'enterprise\')->name(\'enterprise.\')->group(function () {
    Route::get(\'/studio\', [TenantStudioController::class, \'index\'])->name(\'studio\');
    Route::get(\'/applications\', [EntApplicationController::class, \'index\'])->name(\'applications\');
    Route::patch(\'/applications/{id}/status\', [EntApplicationController::class, \'updateStatus\'])->name(\'applications.update-status\');
    Route::get(\'/jobs\', [EntJobController::class, \'index\'])->name(\'jobs\');
    Route::get(\'/jobs/create\', [EntJobController::class, \'create\'])->name(\'jobs.create\');
    Route::post(\'/jobs\', [EntJobController::class, \'store\'])->name(\'jobs.store\');
    Route::get(\'/jobs/{id}/edit\', [EntJobController::class, \'edit\'])->name(\'jobs.edit\');
    Route::patch(\'/jobs/{id}\', [EntJobController::class, \'update\'])->name(\'jobs.update\');
    Route::get(\'/sourcing\', [SourcingController::class, \'index\'])->name(\'sourcing\');
    Route::get(\'/pipeline\', [PipelineController::class, \'index\'])->name(\'pipeline\');
    Route::get(\'/dashboard\', [EntDashboardController::class, \'index\'])->name(\'dashboard\');
    Route::get(\'/onboarding\', [EntOnboardingController::class, \'index\'])->name(\'onboarding\');
    Route::get(\'/roles\', [RoleController::class, \'index\'])->name(\'roles\');
    Route::get(\'/company-profile\', [EntCompanyProfileController::class, \'index\'])->name(\'company-profile\');
    Route::get(\'/workforce\', [WorkforceController::class, \'index\'])->name(\'workforce\');
    Route::get(\'/matching\', [MatchingController::class, \'index\'])->name(\'matching\');
    Route::get(\'/courses\', [EntCourseController::class, \'index\'])->name(\'courses\');
    Route::get(\'/universities\', [EntUniversityController::class, \'index\'])->name(\'universities\');
    Route::get(\'/franchise\', [FranchiseController::class, \'index\'])->name(\'franchise\');
});

// Seeker
Route::middleware([\'auth\', \'role:seeker\'])->prefix(\'seeker\')->name(\'seeker.\')->group(function () {
    Route::get(\'/job-feed\', [JobFeedController::class, \'index\'])->name(\'job-feed\');
    Route::get(\'/job-map\', [JobMapController::class, \'index\'])->name(\'job-map\');
    Route::get(\'/applications\', [SeekerApplicationController::class, \'index\'])->name(\'applications\');
    Route::get(\'/onboarding\', [SeekerOnboardingController::class, \'index\'])->name(\'onboarding\');
    Route::get(\'/profile\', [SeekerProfileController::class, \'index\'])->name(\'profile\');
    Route::patch(\'/profile\', [SeekerProfileController::class, \'update\'])->name(\'profile.update\');
    Route::get(\'/resume\', [ResumeController::class, \'index\'])->name(\'resume\');
    Route::get(\'/interview\', [InterviewController::class, \'index\'])->name(\'interview\');
    Route::get(\'/training\', [TrainingController::class, \'index\'])->name(\'training\');
    Route::get(\'/academic\', [AcademicController::class, \'index\'])->name(\'academic\');
    Route::get(\'/companies\', [CompanyDirectoryController::class, \'index\'])->name(\'companies\');
});

// Shared
Route::middleware([\'auth\'])->group(function () {
    Route::get(\'/messages\', [MessageController::class, \'index\'])->name(\'messages\');
    Route::get(\'/social\', [SocialFeedController::class, \'index\'])->name(\'social\');
    Route::get(\'/ai-coach\', [AiCoachController::class, \'index\'])->name(\'ai-coach\');
    Route::get(\'/settings\', [SettingsController::class, \'index\'])->name(\'settings\');
});');

echo "\n✅ ALL FILES CREATED SUCCESSFULLY!\n";
echo "Total: 15 migrations + 19 models + 1 middleware + 1 auth controller + 30 controllers + 1 routes file\n";
