from editing import *
write('app/Http/Resources/PublicEntrepriseResource.php',r'''<?php
namespace App\Http\Resources;
use App\Models\Entreprise;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
/** @mixin Entreprise */
class PublicEntrepriseResource extends JsonResource
{
    public function toArray(Request $request): array
    {
        $visible = fn (string $field, mixed $value) => ($this->visibilite_liens[$field] ?? true) ? $value : null;
        $named = static fn ($items) => $items->map(fn ($item) => $item->only(['id', 'nom', 'color']))->values()->all();
        $city = $this->ville ? ['id' => $this->ville->id, 'nom' => $this->ville->nom, 'mrc' => $this->ville->mrc?->only(['id', 'nom'])] : null;
        $products = $this->entrepriseProduits->map(function ($item) use ($named): array {
            $result = ['id' => $item->id, 'produit' => $item->produit?->only(['id', 'nom']), 'volume' => $item->volume?->only(['id', 'nom']), 'type_transaction' => $item->typeTransaction?->only(['id', 'nom', 'color'])];
            foreach (['specificites', 'conservations', 'conditionnements', 'typeContenants', 'dureeVies', 'codeBarres', 'quantiteMinimaleCommande', 'disponibilites'] as $relation) {
                $result[\Illuminate\Support\Str::snake($relation)] = $named($item->{$relation});
            }
            return $result;
        })->values()->all();
        return [
            'id' => $this->id, 'nom' => $this->nom, 'slug' => $this->slug,
            'adresse' => $visible('adresse', $this->adresse),
            'codePostal' => $visible('codePostal', $this->codePostal), 'code_postal' => $visible('codePostal', $this->codePostal),
            'courriel' => $visible('courriel', $this->courriel),
            'siteWeb' => $visible('siteWeb', $this->siteWeb), 'site_web' => $visible('siteWeb', $this->siteWeb),
            'facebook' => $visible('facebook', $this->facebook), 'instagram' => $visible('instagram', $this->instagram), 'twitter' => $visible('twitter', $this->twitter),
            'ville' => $visible('ville', $city), 'nomContact' => $this->nomContact,
            'delivery_modes' => $named($this->deliveryModes), 'type_productions' => $named($this->typeProductions),
            'type_clienteles' => $named($this->typeClienteles), 'certifications' => $named($this->certifications),
            'permis' => $named($this->permis), 'certifications_installations' => $named($this->certificationsInstallations),
            'produits' => $products, 'entreprise_produits' => $products,
        ];
    }
}''')
replace('app/Models/Entreprise.php',"'visibilite_liens'];","'visibilite_liens', 'is_published'];")
replace('app/Models/Entreprise.php',"['visibilite_liens' => 'array',","['is_published' => 'boolean', 'visibilite_liens' => 'array',")
replace('app/Models/Entreprise.php','    protected static function booted()',r'''    public function scopePublished(\Illuminate\Database\Eloquent\Builder $query): void
    {
        $query->where('is_published', true)->where(fn ($q) => $q->whereNull('user_id')->orWhereHas('user', fn ($u) => $u->whereNotNull('email_verified_at')));
    }

    protected static function booted()''')
replace('app/Services/CatalogueSearch.php',"Entreprise::query()->with(self::RELATIONS)","Entreprise::query()->published()->with(self::RELATIONS)")
replace('app/Services/CatalogueSearch.php',"->withCount('entreprises')","->withCount(['entreprises' => fn (Builder $q) => $q->published()])")
replace('app/Services/CatalogueSearch.php',"$query->select(DB::raw('count(distinct entreprise_produit.entreprise_id)'))","$query->whereHas('entreprise', fn (Builder $q) => $q->published())->select(DB::raw('count(distinct entreprise_produit.entreprise_id)'))")
replace('app/Services/CatalogueSearch.php',"Entreprise::query()->selectRaw('count(*)')","Entreprise::query()->published()->selectRaw('count(*)')")
replace('app/Http/Controllers/Public/PublicPageController.php',"$this->catalogueSearch->query((string) $request->input('q', ''), $filters)->paginate($perPage)->withQueryString()","$this->catalogueSearch->query((string) $request->input('q', ''), $filters)->paginate($perPage)->withQueryString()->through(fn ($item) => (new \\App\\Http\\Resources\\PublicEntrepriseResource($item))->resolve($request))")
replace('app/Http/Controllers/Public/PublicPageController.php',"return view('public.entreprise', compact('entreprise'));","abort_unless(Entreprise::query()->published()->whereKey($entreprise->id)->exists(), 404);\n\n        return view('public.entreprise', ['entreprise' => (new \\App\\Http\\Resources\\PublicEntrepriseResource($entreprise))->resolve(request())]);")
replace('app/Http/Controllers/Public/SitemapController.php',"Entreprise::query()->orderBy('id')","Entreprise::query()->published()->orderBy('id')")
replace('app/Providers/FortifyServiceProvider.php','        //\n',r'''        $this->app->singleton(\Laravel\Fortify\Contracts\LogoutResponse::class, \App\Http\Responses\LogoutResponse::class);
''',1)
replace('app/Http/Controllers/Settings/ProfileController.php',"return redirect('/');","return $request->header('X-Inertia') ? Inertia::location(route('home')) : redirect('/');")
replace('app/Http/Controllers/Settings/ProfileController.php','public function destroy(ProfileDeleteRequest $request): RedirectResponse','public function destroy(ProfileDeleteRequest $request)')
replace('app/Models/User.php',"'remember_token'])]","'remember_token', 'registration_consents'])]")
replace('app/Models/User.php',"'mrc_id' => 'integer',","'mrc_id' => 'integer',\n            'invitation_pending' => 'boolean',\n            'terms_accepted_at' => 'datetime',\n            'registration_consents' => 'array',")
replace('app/Models/User.php',"return $this->roles()->value('slug');","return collect(['admin', 'acheteur', 'entreprise', 'mrc'])->first(fn ($slug) => $this->hasRole($slug)) ?? $this->roles()->value('slug');")
replace('app/Http/Requests/PublicRegistrationRequest.php',"'type_compte' => ['required',", "'accept_terms' => ['accepted'],\n            'type_compte' => ['required',")
for field in ['nom_entreprise','email_entreprise','adresse','mrc_id','ville_id','code_postal','site_web','facebook','instagram','twitter','consentements','produit_ids']:
    replace('app/Http/Requests/PublicRegistrationRequest.php',f"'{field}' => [",f"'{field}' => ['exclude_unless:type_compte,entreprise',")
replace('app/Http/Requests/PublicRegistrationRequest.php',"'min:3', 'max:40'","'min:1', 'max:40'")
replace('app/Http/Requests/PublicRegistrationRequest.php',"strtoupper((string) $prefix)","strtoupper(preg_replace('/[\\s-]+/', '', (string) $prefix))")
replace('app/Http/Requests/PublicRegistrationRequest.php',"            $normalized =", "            if ($validator->errors()->isNotEmpty()) { return; }\n            $normalized =")
replace('app/Http/Requests/PublicRegistrationRequest.php',"'consentements' => ['exclude_unless:type_compte,entreprise','required_if:type_compte,entreprise', 'nullable', 'array', 'min:1']", "'consentements' => ['exclude_unless:type_compte,entreprise', 'array'],\n            'publish_catalogue' => ['exclude_unless:type_compte,entreprise', 'accepted']")
replace('app/Http/Controllers/Public/RegistrationController.php',"'password' => Hash::make(Str::password(40)),","'password' => Hash::make(Str::password(40)),")
replace('app/Http/Controllers/Public/RegistrationController.php',"            $role = Role::",r'''            $user->forceFill(['invitation_pending' => true, 'terms_accepted_at' => now(), 'registration_consents' => ['version' => '2026-10-20', 'accepted_at' => now()->toIso8601String(), 'consentement_ids' => $data['consentements'] ?? []]])->save();
            $role = Role::''')
replace('app/Http/Controllers/Public/RegistrationController.php',"'nom' => $data['nom_entreprise'],","'nom' => $data['nom_entreprise'],\n                'is_published' => false,")
replace('app/Http/Controllers/Public/RegistrationController.php',"$entreprise->consentements()->sync($data['consentements']);","$entreprise->consentements()->sync($data['consentements'] ?? []);")
start=read('app/Http/Controllers/Public/RegistrationController.php')
a=start.index('        $activationUrl =')
b=start.index("        return to_route('inscription.create')",a)
write('app/Http/Controllers/Public/RegistrationController.php',start[:a]+"        app(\\App\\Services\\AccountInvitation::class)->send($user);\n\n"+start[b:])
write('app/Http/Controllers/Public/AccountActivationController.php',r'''<?php
namespace App\Http\Controllers\Public;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
class AccountActivationController extends Controller
{
    public function __invoke(Request $request, User $user, string $hash): RedirectResponse
    {
        abort_unless(hash_equals($hash, sha1($user->email)), 403);
        if (! $user->invitation_pending) {
            return to_route('login')->with('status', 'Votre compte est déjà activé. Connectez-vous ou utilisez « Mot de passe oublié ».');
        }
        // The signed invitation verifies ownership; setting the password completes activation.
        $token = Password::createToken($user);
        return to_route('password.reset', ['token' => $token, 'email' => $user->email]);
    }
}''')
replace('app/Actions/Fortify/ResetUserPassword.php',"        ])->save();",r'''        ])->save();
        if ($user->invitation_pending) {
            $user->forceFill(['invitation_pending' => false, 'email_verified_at' => now()])->save();
            $user->entreprises()->update(['is_published' => true]);
        }''')
replace('app/Notifications/AccountActivationNotification.php',"Confirmez votre adresse courriel pour activer votre compte RACA.","Choisissez votre mot de passe pour confirmer votre adresse courriel et activer votre compte RACA.")
replace('app/Notifications/AccountActivationNotification.php',"Vous recevrez ensuite un lien sécurisé pour choisir votre mot de passe.","Ce lien sécurisé est valide pendant 24 heures. Aucun second courriel n’est nécessaire.")
replace('routes/web.php',"Route::inertia('/{path}', 'public/NotFound')->where('path', '.*')->name('not-found');","Route::get('/{path}', fn () => Inertia\\Inertia::render('public/NotFound')->toResponse(request())->setStatusCode(404))->where('path', '.*')->name('not-found');")
print('Phase 1 applied')
