<?php
namespace App\Services;
use App\Models\{User,Project,ServicePeriod,Addendum};
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\ValidationException;
class Addenda {
 public function save(User $u,ServicePeriod $period,array $data,int $version,bool $submit=false):Addendum {
  $project=Project::findOrFail($period->project_id);Access::project($u,$project);abort_unless($u->id===$project->customer_id&&$period->order_id&&$period->starts_at->lte(now()),403);
  $data=\Illuminate\Support\Arr::only(app(Intake::class)->clean($data),['products','pages','categories','additional_notes']);
  return DB::transaction(function()use($u,$period,$project,$data,$version,$submit){$p=Project::lockForUpdate()->findOrFail($project->id);$a=Addendum::firstOrCreate(['service_period_id'=>$period->id],['project_id'=>$p->id])->refresh();if($a->version!==$version)throw ValidationException::withMessages(['draft'=>'نسخه فرم این دوره تغییر کرده است؛ صفحه را تازه کنید.']);
   if($submit){abort_unless($p->isActive()&&$period->expires_at->isFuture(),422,'ارسال فقط در زمان فعال این دوره امکان دارد.');if($a->submitted_at&&$a->edits_used>=2)throw ValidationException::withMessages(['draft'=>'دو ویرایش این دوره استفاده شده است.']);
    $check=clone $p;$check->plan_snapshot=$period->snapshot;app(Intake::class)->validate($check,array_merge(['business_name'=>'دوره تکمیلی','site_title'=>$p->name,'site_type'=>'store','contact_phone'=>$u->mobile],$data));
    if($a->submitted_at&&$a->data===$data)throw ValidationException::withMessages(['draft'=>'تغییر جدیدی ثبت نشده است.']);if($a->submitted_at)$a->edits_used++;
    $a->data=$data;$a->submitted_at=$a->submitted_at??now();
   }
   $a->draft_data=$data;$a->version++;$a->save();
   if($submit){DB::table('addendum_revisions')->insert(['addendum_id'=>$a->id,'user_id'=>$u->id,'version'=>$a->version,'data'=>json_encode($data,JSON_UNESCAPED_UNICODE),'created_at'=>now(),'updated_at'=>now()]);app(ProjectFlow::class)->activity($p,$u,'addendum','اطلاعات تکمیلی دوره تمدید ارسال شد.',true);app(Notify::class)->event('form_submitted',$p,['revision_number'=>$a->version],"addendum:$a->id:$a->version");}
   return $a;
  },3);
 }
}
