import {mkdir,unlink,writeFile} from "node:fs/promises";
import path from "node:path";
import {randomUUID} from "node:crypto";
import {eq} from "drizzle-orm";
import {getDb} from "../../../db";
import {assignments,drivers,inspectionItems,inspectionPhotos,inspections,ticketMessages,tickets,vehicles} from "../../../db/schema";
import {getFleetUser} from "../../../lib/fleet-auth";
import {INSPECTION_GROUPS,INSPECTION_ITEM_COUNT,INSPECTION_PHOTOS} from "../../../lib/inspection-config";
const bad=(message:string,status=400)=>Response.json({error:message},{status});
const uploadRoot=()=>path.resolve(process.env.UPLOAD_DIR||"/tmp/fleet-inspections");
const allowed=new Map([["image/jpeg","jpg"],["image/png","png"],["image/webp","webp"]]);
export async function POST(request:Request){
 const session=await getFleetUser(request);if(!session)return bad("نشست معتبر نیست.",401);if(session.profile.role!=="supervisor")return bad("ثبت بازرسی فقط توسط سوپروایزر انجام می‌شود.",403);
 const form=await request.formData(),payload=JSON.parse(String(form.get("payload")||"{}"));const vehicleId=Number(payload.vehicleId),odometer=Number(payload.odometer);if(!vehicleId||!odometer)return bad("خودرو و کارکرد فعلی الزامی است.");
 const states=payload.items||{};const definitions=(INSPECTION_GROUPS as unknown as {key:string;items:readonly (readonly [string,string])[]}[]).flatMap(g=>g.items.map(([key,label])=>({groupKey:g.key,itemKey:key,label})));if(definitions.length!==INSPECTION_ITEM_COUNT||definitions.some(i=>!["ok","defect"].includes(states[i.itemKey]?.status)))return bad("وضعیت تمام موارد چک‌لیست را مشخص کنید.");
 const files:{kind:string,file:File,absolute:string,relative:string,ext:string}[]=[];let total=0;for(const [kind] of INSPECTION_PHOTOS){const file=form.get(`photo_${kind}`);if(!(file instanceof File)||!file.size)return bad("ثبت هر هشت نمای خودرو و کابین الزامی است.");const ext=allowed.get(file.type);if(!ext)return bad("فرمت عکس باید JPG، PNG یا WEBP باشد.");if(file.size>10*1024*1024)return bad("حجم هر عکس باید حداکثر ۱۰ مگابایت باشد.");total+=file.size;if(total>60*1024*1024)return bad("حجم مجموع تصاویر بیش از حد مجاز است.");const relative=`${new Date().getUTCFullYear()}/${randomUUID()}.${ext}`;files.push({kind,file,relative,absolute:path.join(uploadRoot(),relative),ext})}
 const db=getDb(),[vehicle]=await db.select().from(vehicles).where(eq(vehicles.id,vehicleId)).limit(1);if(!vehicle)return bad("خودرو پیدا نشد.",404);if(odometer<vehicle.mileage)return bad("کارکرد جدید نمی‌تواند کمتر از کارکرد ثبت‌شده باشد.");const allAssignments=await db.select().from(assignments).where(eq(assignments.vehicleId,vehicleId));const current=allAssignments.find(a=>["active","pending_return"].includes(a.status));const hasDefect=definitions.some(i=>states[i.itemKey].status==="defect")||!payload.technicalCertificateValid||!payload.driverLicenseValid;const inspectedAt=payload.inspectedAt||new Date().toISOString(),next=new Date(inspectedAt);next.setUTCDate(next.getUTCDate()+vehicle.inspectionIntervalDays);const code=`CHK-${new Date().getUTCFullYear()}-${Math.floor(1000+Math.random()*9000)}`;
 await Promise.all(files.map(async f=>{await mkdir(path.dirname(f.absolute),{recursive:true});await writeFile(f.absolute,Buffer.from(await f.file.arrayBuffer()))}));
 try{const result=await db.transaction(async tx=>{const [row]=await tx.insert(inspections).values({code,vehicleId,driverId:current?.driverId||null,assignmentId:current?.id||null,inspectorUserId:session.profile.id,inspectorName:session.profile.full_name,inspectedAt,odometer,technicalCertificateValid:Boolean(payload.technicalCertificateValid),driverLicenseValid:Boolean(payload.driverLicenseValid),supervisorStatus:hasDefect?"rejected":"approved",managerStatus:"pending",nextDueAt:next.toISOString(),notes:String(payload.notes||"")}).returning();await tx.insert(inspectionItems).values(definitions.map(i=>({inspectionId:row.id,...i,status:states[i.itemKey].status,note:String(states[i.itemKey].note||"")})));await tx.insert(inspectionPhotos).values(files.map(f=>({inspectionId:row.id,kind:f.kind,filePath:f.relative,originalName:f.file.name,mimeType:f.file.type,sizeBytes:f.file.size})));await tx.update(vehicles).set({mileage:odometer,status:hasDefect?"inspection_hold":vehicle.status}).where(eq(vehicles.id,vehicleId));if(hasDefect){const [t]=await tx.insert(tickets).values({code:`TKT-${Date.now().toString().slice(-8)}`,subject:`نقص در بازرسی ${vehicle.title}`,category:"inspection",priority:"high",vehicleId,driverId:current?.driverId||null,assignmentId:current?.id||null,reporter:session.profile.full_name,assignee:"مدیر ناوگان",description:`بازرسی ${code} دارای مورد نقص یا مدرک نامعتبر است و تا تعیین تکلیف نیازمند پیگیری است.`}).returning();await tx.insert(ticketMessages).values({ticketId:t.id,author:"سامانه بازرسی",authorRole:"system",body:"تیکت به‌صورت خودکار از نتیجه بازرسی ایجاد شد."})}return row});return Response.json({row:result},{status:201})}catch(e){await Promise.all(files.map(f=>unlink(f.absolute).catch(()=>{})));throw e}
}
export async function PATCH(request:Request){const session=await getFleetUser(request);if(!session||session.profile.role!=="general_manager")return bad("تأیید نهایی بازرسی فقط در اختیار مدیر کل است.",403);const b:any=await request.json(),db=getDb(),[row]=await db.select().from(inspections).where(eq(inspections.id,Number(b.id))).limit(1);if(!row)return bad("بازرسی پیدا نشد.",404);await db.update(inspections).set({managerStatus:b.approved?"approved":"rejected",managerNote:String(b.note||"")}).where(eq(inspections.id,row.id));if(b.approved){const held=(await db.select().from(assignments).where(eq(assignments.vehicleId,row.vehicleId))).some(a=>["active","pending_return"].includes(a.status));await db.update(vehicles).set({status:held?"assigned":"ready"}).where(eq(vehicles.id,row.vehicleId))}return Response.json({ok:true})}
