import { and, desc, eq } from "drizzle-orm";
import { getDb } from "../../../db";
import { approvals, assignments, drivers, maintenance, vehicles, vehicleTypes, vehicleRequests, tickets, ticketMessages, smsLogs, inspections, inspectionItems, inspectionPhotos } from "../../../db/schema";
import {getFleetUser} from "../../../lib/fleet-auth";

const fail=(error:unknown,status=500)=>Response.json({error:error instanceof Error?error.message:"خطای ناشناخته"},{status});
const ticketCode=()=>`TKT-${Date.now().toString().slice(-8)}`;
async function notify(db:any,event:string,receptor:string,token:string,ticketCodeValue:string){
  const e=process.env as any, template=e[`KAVENEGAR_TEMPLATE_${event.toUpperCase()}`]||e.KAVENEGAR_TEMPLATE_DEFAULT||"";
  if(!e.KAVENEGAR_API_KEY||!template){await db.insert(smsLogs).values({event,receptor,template,token,status:"unconfigured",responseMessage:"کلید API یا نام الگو هنوز تنظیم نشده است"});return;}
  try{const url=new URL(`https://api.kavenegar.com/v1/${e.KAVENEGAR_API_KEY}/verify/lookup.json`);url.searchParams.set("receptor",receptor);url.searchParams.set("token",token.replace(/\s+/g,"-").slice(0,100));url.searchParams.set("token2",ticketCodeValue);url.searchParams.set("template",template);const res=await fetch(url.toString());const out:any=await res.json();const entry=Array.isArray(out.entries)?out.entries[0]:out.entries;await db.insert(smsLogs).values({event,receptor,template,token,status:res.ok&&out.return?.status===200?"sent":"failed",providerMessageId:entry?.messageid?String(entry.messageid):null,responseMessage:out.return?.message||"پاسخ نامشخص"});}
  catch(error){await db.insert(smsLogs).values({event,receptor,template,token,status:"failed",responseMessage:error instanceof Error?error.message:"خطای ارسال"});}
}

async function seedDemoData(db:any, types:any[]){
  const existing=await db.select({id:vehicles.id}).from(vehicles).where(eq(vehicles.plate,"ایران ۴۵ ـ ۶۸ ع ۲۱۱")).limit(1);if(existing.length)return;
  const byName=(name:string)=>types.find(t=>t.name===name)?.id;
  const vs=await db.insert(vehicles).values([
    {typeId:byName("سانتافه"),title:"هیوندای سانتافه",model:"سانتافه",plate:"ایران ۴۵ ـ ۶۸ ع ۲۱۱",vin:"KMHSU81XDKU482671",year:2024,color:"سفید",mileage:32450,status:"assigned",notes:"بیمه بدنه تا اسفند ۱۴۰۵"},
    {typeId:byName("سراتو"),title:"کیا سراتو",model:"سراتو",plate:"ایران ۶۷ ـ ۲۲ ب ۸۱۴",vin:"KNAFX411BE5129084",year:2018,color:"مشکی",mileage:78520,status:"assigned"},
    {typeId:byName("پارس"),title:"پژو پارس",model:"پارس",plate:"ایران ۳۱ ـ ۷۱ ج ۳۸۵",vin:"IRFC7NAJ8N2301456",year:2022,color:"نقره‌ای",mileage:96400,status:"ready"},
    {typeId:byName("RAV4"),title:"تویوتا RAV4",model:"RAV4",plate:"ایران ۵۵ ـ ۴۳ د ۹۲۰",vin:"JTMRFREV0JD218772",year:2019,color:"خاکستری",mileage:54120,status:"assigned"},
    {typeId:byName("تارا"),title:"ایران خودرو تارا",model:"تارا",plate:"ایران ۴۴ ـ ۸۹ ص ۳۶۱",vin:"IRNTA1405M0012689",year:2023,color:"آبی",mileage:21800,status:"pending"},
    {typeId:byName("لندکروزر"),title:"تویوتا لندکروزر",model:"لندکروزر",plate:"ایران ۷۷ ـ ۱۲ ل ۷۴۲",vin:"JTMHV05J704182331",year:2017,color:"سفید",mileage:112600,status:"ready"}
  ]).returning();
  const ds=await db.insert(drivers).values([
    {fullName:"رضا محمدی",nationalId:"۳۰۹۱۵۷۸۴۲۱",phone:"09131234567",licenseNo:"KRM-18452",licenseExpiry:"2027-03-18",notes:"راننده ارشد مسیرهای بین‌شهری"},
    {fullName:"سعید کریمی",nationalId:"۳۰۹۲۴۸۷۳۱۵",phone:"09133456789",licenseNo:"KRM-20114",licenseExpiry:"2026-12-02"},
    {fullName:"علی رضایی",nationalId:"۳۰۸۹۶۵۴۱۲۷",phone:"09361239876",licenseNo:"KRM-17603",licenseExpiry:"2027-07-21"},
    {fullName:"حسین اکبری",nationalId:"۳۰۹۴۱۲۸۷۵۶",phone:"09131987654",licenseNo:"KRM-22587",licenseExpiry:"2028-01-10"},
    {fullName:"مجتبی امینی",nationalId:"۳۰۸۷۴۱۲۵۹۶",phone:"09135554433",licenseNo:"KRM-19342",licenseExpiry:"2026-10-14"}
  ]).returning();
  const as=await db.insert(assignments).values([
    {vehicleId:vs[0].id,driverId:ds[0].id,startAt:"2026-09-03T05:30:00Z",purpose:"جلسه با نمایندگی منطقه",destination:"کرمان",startMileage:32110,status:"active"},
    {vehicleId:vs[1].id,driverId:ds[1].id,startAt:"2026-09-04T07:15:00Z",purpose:"بازدید شعبه",destination:"رفسنجان",startMileage:78380,status:"active"},
    {vehicleId:vs[3].id,driverId:ds[2].id,startAt:"2026-09-05T04:45:00Z",purpose:"مأموریت اداری",destination:"بندرعباس",startMileage:54120,status:"active"},
    {vehicleId:vs[4].id,driverId:ds[3].id,startAt:"2026-08-28T06:00:00Z",endAt:"2026-08-30T16:10:00Z",purpose:"تحویل اسناد",destination:"یزد",startMileage:21220,endMileage:21800,status:"pending_return"}
  ]).returning();
  await db.insert(maintenance).values([
    {vehicleId:vs[1].id,title:"تعویض روغن و فیلترها",dueDate:"2026-09-08",dueMileage:80000,cost:4200000,vendor:"تعمیرگاه مرکزی",status:"scheduled"},
    {vehicleId:vs[0].id,title:"بازدید دوره‌ای ترمز",dueDate:"2026-09-12",dueMileage:35000,cost:2800000,status:"scheduled"},
    {vehicleId:vs[2].id,title:"معاینه فنی سالانه",dueDate:"2026-09-18",cost:750000,vendor:"مرکز معاینه فنی",status:"scheduled"},
    {vehicleId:vs[5].id,title:"سرویس سیستم تعلیق",dueDate:"2026-08-25",cost:18600000,vendor:"تویوتا جنوب",status:"completed",completedAt:"2026-08-25T12:30:00Z"}
  ]);
  const ts=await db.insert(tickets).values([
    {code:"TKT-1405-001",subject:"تخصیص سانتافه به رضا محمدی",category:"assignment",priority:"normal",status:"open",vehicleId:vs[0].id,driverId:ds[0].id,assignmentId:as[0].id,reporter:"سیستم",assignee:"سوپروایزر شیفت",description:"خودرو برای مأموریت کرمان تحویل راننده شد. بررسی و اعلام مغایرت ضروری است."},
    {code:"TKT-1405-002",subject:"صدای غیرعادی چرخ جلو سراتو",category:"defect",priority:"high",status:"in_progress",vehicleId:vs[1].id,driverId:ds[1].id,assignmentId:as[1].id,reporter:"سعید کریمی",assignee:"مسئول فنی",description:"در سرعت بالای ۸۰ کیلومتر صدای ممتد از چرخ جلو سمت شاگرد شنیده می‌شود."},
    {code:"TKT-1405-003",subject:"مغایرت کیلومتر هنگام عودت تارا",category:"discrepancy",priority:"urgent",status:"waiting",vehicleId:vs[4].id,driverId:ds[3].id,assignmentId:as[3].id,reporter:"انبار خودرو",assignee:"مدیر ناوگان",description:"عدد کیلومتر ثبت‌شده با فرم تحویل ۱۲۵ کیلومتر اختلاف دارد؛ تا بررسی نهایی عودت تأیید نشود."},
    {code:"TKT-1405-004",subject:"تأیید هزینه سرویس لندکروزر",category:"maintenance",priority:"normal",status:"closed",vehicleId:vs[5].id,reporter:"مسئول فنی",assignee:"مدیریت",description:"فاکتور سرویس سیستم تعلیق بررسی و با مبلغ ۱۸٬۶۰۰٬۰۰۰ تومان تأیید شد.",closedAt:"2026-08-26T09:20:00Z"}
  ]).returning();
  await db.insert(ticketMessages).values([
    {ticketId:ts[0].id,author:"سامانه راهبر",authorRole:"system",body:"تخصیص با کیلومتر ۳۲٬۱۱۰ ثبت و برای سوپروایزر ارسال شد."},
    {ticketId:ts[1].id,author:"سعید کریمی",authorRole:"driver",body:"صدا بعد از عبور از دست‌انداز بیشتر می‌شود. فیلم کوتاه هم برای مسئول فنی ارسال شد."},
    {ticketId:ts[1].id,author:"مهدی احمدی",authorRole:"management",body:"تا بررسی تعمیرگاه از ادامه مسیر خارج شهری خودداری شود."},
    {ticketId:ts[2].id,author:"انبار خودرو",authorRole:"supervisor",body:"تصویر کیلومتر خودرو و فرم تحویل بایگانی شد؛ منتظر توضیح راننده هستیم."},
    {ticketId:ts[3].id,author:"مدیریت",authorRole:"management",body:"فاکتور و قطعات تعویضی رؤیت شد. تیکت بسته شد."}
  ]);
  await db.insert(approvals).values({type:"return",referenceId:as[3].id,title:"تأیید عودت تارا",requestedBy:"انبار خودرو"});
  await db.insert(smsLogs).values([
    {event:"ticket_created",receptor:"09131234567",template:"",token:"تخصیص سانتافه",status:"unconfigured",responseMessage:"اطلاعات کاوه‌نگار هنوز تنظیم نشده است"},
    {event:"ticket_created",receptor:"09133456789",template:"",token:"تیکت ایراد سراتو",status:"unconfigured",responseMessage:"اطلاعات کاوه‌نگار هنوز تنظیم نشده است"},
    {event:"ticket_message",receptor:"09133456789",template:"",token:"پاسخ جدید",status:"unconfigured",responseMessage:"اطلاعات کاوه‌نگار هنوز تنظیم نشده است"}
  ]);
}

async function seedAssignmentHistory(db:any){
  const [vs,ds]=await Promise.all([db.select().from(vehicles).orderBy(vehicles.id),db.select().from(drivers).orderBy(drivers.id)]);
  if(vs.length<4||ds.length<4)return;
  const history=[
    {vehicleId:vs[0].id,driverId:ds[1].id,startAt:"2026-08-19T04:35:00Z",endAt:"2026-08-19T15:42:00Z",purpose:"بازدید دوره‌ای شعب منطقه جنوب — داده نمایشی",destination:"رفسنجان",startMileage:31840,endMileage:32075,status:"returned"},
    {vehicleId:vs[2].id,driverId:ds[4%ds.length].id,startAt:"2026-08-11T05:10:00Z",endAt:"2026-08-12T13:25:00Z",purpose:"پیگیری امور بیمه ناوگان",destination:"کرمان",startMileage:95620,endMileage:96030,status:"returned"},
    {vehicleId:vs[5%vs.length].id,driverId:ds[0].id,startAt:"2026-08-03T02:55:00Z",endAt:"2026-08-05T17:05:00Z",purpose:"بازدید پروژه معدنی",destination:"گل‌گهر",startMileage:111740,endMileage:112180,status:"returned"},
    {vehicleId:vs[1].id,driverId:ds[2].id,startAt:"2026-07-24T06:20:00Z",endAt:"2026-07-24T16:48:00Z",purpose:"تحویل قراردادهای نمایندگی",destination:"بافت",startMileage:77410,endMileage:77755,status:"returned"},
    {vehicleId:vs[3].id,driverId:ds[3].id,startAt:"2026-07-15T03:40:00Z",endAt:"2026-07-17T14:12:00Z",purpose:"جلسه هماهنگی عملیات جنوب",destination:"بندرعباس",startMileage:52980,endMileage:53660,status:"returned"},
    {vehicleId:vs[4].id,driverId:ds[1].id,startAt:"2026-07-06T05:45:00Z",endAt:"2026-07-06T12:30:00Z",purpose:"مراجعه به اداره مالیات",destination:"سیرجان",startMileage:20540,endMileage:20625,status:"returned"},
    {vehicleId:vs[2].id,driverId:ds[0].id,startAt:"2026-06-27T04:15:00Z",endAt:"2026-06-28T18:20:00Z",purpose:"انتقال تجهیزات واحد فنی",destination:"شهربابک",startMileage:94720,endMileage:95140,status:"returned"},
    {vehicleId:vs[0].id,driverId:ds[3].id,startAt:"2026-06-14T01:50:00Z",endAt:"2026-06-16T15:35:00Z",purpose:"حضور در نمایشگاه تخصصی",destination:"تهران",startMileage:30110,endMileage:31690,status:"returned"},
    {vehicleId:vs[1].id,driverId:ds[4%ds.length].id,startAt:"2026-06-03T07:05:00Z",endAt:"2026-06-03T14:40:00Z",purpose:"بازدید انبار قطعات",destination:"کرمان",startMileage:76720,endMileage:77105,status:"returned"},
    {vehicleId:vs[5%vs.length].id,driverId:ds[2].id,startAt:"2026-05-22T03:25:00Z",endAt:"2026-05-23T16:15:00Z",purpose:"بازدید ایمنی مسیرهای عملیاتی",destination:"بردسیر",startMileage:110930,endMileage:111360,status:"returned"},
    {vehicleId:vs[4].id,driverId:ds[0].id,startAt:"2026-05-09T05:30:00Z",endAt:"2026-05-09T11:55:00Z",purpose:"تحویل اسناد بانکی",destination:"سیرجان",startMileage:19880,endMileage:19945,status:"returned"},
    {vehicleId:vs[3].id,driverId:ds[1].id,startAt:"2026-04-25T04:00:00Z",endAt:"2026-04-27T13:10:00Z",purpose:"ماموریت پشتیبانی شعبه",destination:"یزد",startMileage:51740,endMileage:52610,status:"returned"},
    {vehicleId:vs[2].id,driverId:ds[3].id,startAt:"2026-04-12T06:45:00Z",endAt:"2026-04-12T17:25:00Z",purpose:"جلسه با پیمانکار خدماتی",destination:"رفسنجان",startMileage:93910,endMileage:94300,status:"returned"},
    {vehicleId:vs[1].id,driverId:ds[0].id,startAt:"2026-03-28T02:35:00Z",endAt:"2026-03-30T18:05:00Z",purpose:"بازدید پایان سال شعب",destination:"بندرعباس",startMileage:75260,endMileage:76420,status:"returned"},
    {vehicleId:vs[0].id,driverId:ds[2].id,startAt:"2026-03-10T05:20:00Z",endAt:"2026-03-10T15:50:00Z",purpose:"تحویل تجهیزات شبکه",destination:"کرمان",startMileage:29430,endMileage:29910,status:"returned"}
  ];
  const existing=await db.select({startAt:assignments.startAt}).from(assignments);
  const starts=new Set(existing.map((row:any)=>row.startAt));
  const missing=history.filter(row=>!starts.has(row.startAt));
  for(let i=0;i<missing.length;i+=4)await db.insert(assignments).values(missing.slice(i,i+4));
}

async function seedInspectionHistory(db:any){
 const exists=await db.select({id:inspections.id}).from(inspections).limit(1);if(exists.length)return;
 const [vs,ds,as]=await Promise.all([db.select().from(vehicles).orderBy(vehicles.id),db.select().from(drivers).orderBy(drivers.id),db.select().from(assignments).orderBy(assignments.id)]);if(!vs.length)return;
 const samples=[
  {code:"CHK-1405-7281",vehicleId:vs[0].id,driverId:ds[0]?.id,assignmentId:as.find((a:any)=>a.vehicleId===vs[0].id)?.id,inspectedAt:"2026-09-01T06:22:00Z",odometer:32310,technicalCertificateValid:true,driverLicenseValid:true,supervisorStatus:"approved",managerStatus:"approved",nextDueAt:"2026-10-01T06:22:00Z",inspectorUserId:"demo",inspectorName:"مهران کامجو"},
  {code:"CHK-1405-6950",vehicleId:vs[1].id,driverId:ds[1]?.id,assignmentId:as.find((a:any)=>a.vehicleId===vs[1].id)?.id,inspectedAt:"2026-08-18T15:19:00Z",odometer:77980,technicalCertificateValid:true,driverLicenseValid:true,supervisorStatus:"approved",managerStatus:"pending",nextDueAt:"2026-09-17T15:19:00Z",inspectorUserId:"demo",inspectorName:"مهران کامجو"},
  {code:"CHK-1405-6345",vehicleId:vs[3]?.id||vs[0].id,driverId:ds[2]?.id,assignmentId:as.find((a:any)=>a.vehicleId===(vs[3]?.id||vs[0].id))?.id,inspectedAt:"2026-07-17T16:41:00Z",odometer:52610,technicalCertificateValid:true,driverLicenseValid:true,supervisorStatus:"rejected",managerStatus:"rejected",managerNote:"رفع نقص چراغ جلو و ثبت بازرسی مجدد",nextDueAt:"2026-07-18T16:41:00Z",inspectorUserId:"demo",inspectorName:"مهران کامجو"}
 ];
 for(const sample of samples){const [row]=await db.insert(inspections).values(sample).returning();await db.insert(inspectionItems).values([{inspectionId:row.id,groupKey:"technical",itemKey:"engine_oil",label:"سطح روغن موتور، ترمز و هیدرولیک",status:sample.supervisorStatus==="approved"?"ok":"defect",note:sample.supervisorStatus==="approved"?"":"چراغ جلو سمت راننده نیازمند تعویض است"},{inspectionId:row.id,groupKey:"safety",itemKey:"fire_extinguisher",label:"کپسول آتش‌نشانی، پلمپ و تاریخ شارژ",status:"ok",note:""}])}
}

export async function GET(request:Request){
  try{const session=await getFleetUser(request);if(!session)return fail(new Error("برای مشاهده اطلاعات وارد سامانه شوید."),401);const db=getDb(); let types=await db.select().from(vehicleTypes).orderBy(vehicleTypes.id);if(!types.length){await db.insert(vehicleTypes).values([
    {brand:"هیوندای",name:"سانتافه",category:"شاسی‌بلند",imageUrl:"/cars/santafe.jpg"},{brand:"کیا",name:"سراتو",category:"سدان",imageUrl:"/cars/cerato.jpg"},
    {brand:"پژو",name:"پارس",category:"سدان",imageUrl:"/cars/pars.jpg"},{brand:"تویوتا",name:"RAV4",category:"کراس‌اوور",imageUrl:"/cars/rav4.jpg"},
    {brand:"ایران خودرو",name:"تارا",category:"سدان",imageUrl:"/cars/tara.jpg"},{brand:"تویوتا",name:"لندکروزر",category:"شاسی‌بلند",imageUrl:"/cars/landcruiser.jpg"}
  ]);types=await db.select().from(vehicleTypes).orderBy(vehicleTypes.id)} await seedDemoData(db,types);await seedAssignmentHistory(db);await seedInspectionHistory(db); const [vs,ds,as,ms,ps,vrs,ts,tms,sms,ins,ii,ip]=await Promise.all([
    db.select({id:vehicles.id,typeId:vehicles.typeId,title:vehicles.title,model:vehicles.model,plate:vehicles.plate,vin:vehicles.vin,year:vehicles.year,color:vehicles.color,mileage:vehicles.mileage,status:vehicles.status,inspectionIntervalDays:vehicles.inspectionIntervalDays,notes:vehicles.notes,createdAt:vehicles.createdAt,typeName:vehicleTypes.name,brand:vehicleTypes.brand,imageUrl:vehicleTypes.imageUrl}).from(vehicles).leftJoin(vehicleTypes,eq(vehicles.typeId,vehicleTypes.id)).orderBy(desc(vehicles.id)), db.select().from(drivers).orderBy(desc(drivers.id)),
    db.select({id:assignments.id,vehicleId:assignments.vehicleId,driverId:assignments.driverId,startAt:assignments.startAt,expectedReturnAt:assignments.expectedReturnAt,endAt:assignments.endAt,assignmentType:assignments.assignmentType,purpose:assignments.purpose,destination:assignments.destination,startMileage:assignments.startMileage,endMileage:assignments.endMileage,status:assignments.status,returnRequestedAt:assignments.returnRequestedAt,returnedApprovedAt:assignments.returnedApprovedAt,vehicle:vehicles.title,plate:vehicles.plate,driver:drivers.fullName}).from(assignments).leftJoin(vehicles,eq(assignments.vehicleId,vehicles.id)).leftJoin(drivers,eq(assignments.driverId,drivers.id)).orderBy(desc(assignments.startAt)),
    db.select({id:maintenance.id,vehicleId:maintenance.vehicleId,title:maintenance.title,dueDate:maintenance.dueDate,dueMileage:maintenance.dueMileage,cost:maintenance.cost,vendor:maintenance.vendor,notes:maintenance.notes,status:maintenance.status,completedAt:maintenance.completedAt,vehicle:vehicles.title,plate:vehicles.plate}).from(maintenance).leftJoin(vehicles,eq(maintenance.vehicleId,vehicles.id)).orderBy(desc(maintenance.id)),
    db.select().from(approvals).orderBy(desc(approvals.id)),
    db.select({id:vehicleRequests.id,vehicleId:vehicleRequests.vehicleId,driverId:vehicleRequests.driverId,purpose:vehicleRequests.purpose,destination:vehicleRequests.destination,requestedAt:vehicleRequests.requestedAt,status:vehicleRequests.status,supervisorNote:vehicleRequests.supervisorNote,resolvedAt:vehicleRequests.resolvedAt,vehicle:vehicles.title,plate:vehicles.plate,typeId:vehicles.typeId,driver:drivers.fullName,imageUrl:vehicleTypes.imageUrl,color:vehicles.color,year:vehicles.year,mileage:vehicles.mileage}).from(vehicleRequests).leftJoin(vehicles,eq(vehicleRequests.vehicleId,vehicles.id)).leftJoin(vehicleTypes,eq(vehicles.typeId,vehicleTypes.id)).leftJoin(drivers,eq(vehicleRequests.driverId,drivers.id)).orderBy(desc(vehicleRequests.id)),
    db.select({id:tickets.id,code:tickets.code,subject:tickets.subject,category:tickets.category,priority:tickets.priority,status:tickets.status,vehicleId:tickets.vehicleId,driverId:tickets.driverId,assignmentId:tickets.assignmentId,reporter:tickets.reporter,assignee:tickets.assignee,description:tickets.description,closedAt:tickets.closedAt,createdAt:tickets.createdAt,updatedAt:tickets.updatedAt,vehicle:vehicles.title,plate:vehicles.plate,driver:drivers.fullName}).from(tickets).leftJoin(vehicles,eq(tickets.vehicleId,vehicles.id)).leftJoin(drivers,eq(tickets.driverId,drivers.id)).orderBy(desc(tickets.updatedAt)),
    db.select().from(ticketMessages).orderBy(ticketMessages.createdAt),
    db.select().from(smsLogs).orderBy(desc(smsLogs.id)).limit(100),
    db.select({id:inspections.id,code:inspections.code,vehicleId:inspections.vehicleId,driverId:inspections.driverId,assignmentId:inspections.assignmentId,inspectorUserId:inspections.inspectorUserId,inspectorName:inspections.inspectorName,inspectedAt:inspections.inspectedAt,odometer:inspections.odometer,technicalCertificateValid:inspections.technicalCertificateValid,driverLicenseValid:inspections.driverLicenseValid,supervisorStatus:inspections.supervisorStatus,managerStatus:inspections.managerStatus,managerNote:inspections.managerNote,nextDueAt:inspections.nextDueAt,notes:inspections.notes,vehicle:vehicles.title,plate:vehicles.plate,driver:drivers.fullName}).from(inspections).leftJoin(vehicles,eq(inspections.vehicleId,vehicles.id)).leftJoin(drivers,eq(inspections.driverId,drivers.id)).orderBy(desc(inspections.inspectedAt)),
    db.select().from(inspectionItems).orderBy(inspectionItems.id),db.select().from(inspectionPhotos).orderBy(inspectionPhotos.id)
  ]);
    const held=as.filter((a:any)=>['active','pending_return'].includes(a.status)),enrichedVs=vs.map((v:any)=>({...v,currentAssignment:held.find((a:any)=>a.vehicleId===v.id)||null,lastInspection:ins.find((x:any)=>x.vehicleId===v.id)||null})),inspectionRows=ins.map((x:any)=>({...x,items:ii.filter((i:any)=>i.inspectionId===x.id),photos:ip.filter((p:any)=>p.inspectionId===x.id).map((p:any)=>({...p,url:`/api/inspection-photo/${p.id}`}))}));
    if(session.profile.role==='driver'){const driverId=Number(session.profile.driver_id),ownAssignments=as.filter((a:any)=>a.driverId===driverId),vehicleIds=new Set(ownAssignments.map((a:any)=>a.vehicleId)),ownTickets=ts.filter((t:any)=>t.driverId===driverId||vehicleIds.has(t.vehicleId)),visibleVehicles=enrichedVs.filter((v:any)=>v.status==='ready'||v.currentAssignment?.driverId===driverId);return Response.json({vehicleTypes:types.filter((t:any)=>visibleVehicles.some((v:any)=>v.typeId===t.id)),vehicles:visibleVehicles,drivers:ds.filter((d:any)=>d.id===driverId),assignments:[],vehicleRequests:vrs.filter((r:any)=>r.driverId===driverId),maintenance:ms.filter((m:any)=>vehicleIds.has(m.vehicleId)),approvals:[],inspections:inspectionRows.filter((x:any)=>x.driverId===driverId||vehicleIds.has(x.vehicleId)),tickets:ownTickets,ticketMessages:tms.filter((m:any)=>ownTickets.some((t:any)=>t.id===m.ticketId)),smsLogs:[],smsConfigured:false,profile:session.profile})}
    return Response.json({vehicleTypes:types,vehicles:enrichedVs,drivers:ds,assignments:as,vehicleRequests:vrs,maintenance:ms,approvals:ps,inspections:inspectionRows,tickets:ts,ticketMessages:tms,smsLogs:sms,smsConfigured:Boolean(process.env.KAVENEGAR_API_KEY&&process.env.KAVENEGAR_TEMPLATE_DEFAULT),profile:session.profile});
  }catch(e){console.error("fleet data load failed",e);return Response.json({error:"دریافت اطلاعات سامانه با خطا مواجه شد. لطفاً دوباره تلاش کنید."},{status:500})}
}

export async function POST(request:Request){
 try{const session=await getFleetUser(request);if(!session)return fail(new Error("نشست معتبر نیست."),401);const b=await request.json() as Record<string,any>;if(session.profile.role==='driver'&&!['ticket.create','ticket.message','assignment.return','vehicle.request'].includes(b.action))return fail(new Error("این عملیات در سطح دسترسی راننده مجاز نیست."),403);if(session.profile.role==='supervisor'&&['driver.save','driver.delete','type.save','type.delete','vehicle.save','vehicle.delete'].includes(b.action))return fail(new Error("این عملیات فقط در اختیار مدیر کل است."),403);const db=getDb();const now=new Date().toISOString();
 switch(b.action){
  case "vehicle.save":{const [type]=await db.select().from(vehicleTypes).where(eq(vehicleTypes.id,Number(b.typeId))).limit(1);if(!type)return fail(new Error("نوع خودرو را انتخاب کنید."),400);const values={typeId:type.id,title:`${type.brand} ${type.name}`,model:type.name,plate:b.plate,vin:b.vin||"",year:b.year?Number(b.year):null,color:b.color||"",mileage:Number(b.mileage||0),notes:b.notes||""};const [row]=b.id?await db.update(vehicles).set(values).where(eq(vehicles.id,Number(b.id))).returning():await db.insert(vehicles).values(values).returning();return Response.json({row},{status:b.id?200:201});}
  case "vehicle.delete":{const active=await db.select({id:assignments.id}).from(assignments).where(and(eq(assignments.vehicleId,Number(b.id)),eq(assignments.status,"active"))).limit(1);if(active.length)return fail(new Error("خودرو در تخصیص فعال است و قابل حذف نیست."),409);await db.delete(maintenance).where(eq(maintenance.vehicleId,Number(b.id)));await db.delete(vehicles).where(eq(vehicles.id,Number(b.id)));return Response.json({ok:true});}
  case "driver.save":{const values={fullName:b.fullName,nationalId:b.nationalId,phone:b.phone,licenseNo:b.licenseNo,licenseExpiry:b.licenseExpiry||"",notes:b.notes||""};const [row]=b.id?await db.update(drivers).set(values).where(eq(drivers.id,Number(b.id))).returning():await db.insert(drivers).values(values).returning();return Response.json({row},{status:b.id?200:201});}
  case "type.save":{const values={brand:b.brand,name:b.name,category:b.category||"سواری",imageUrl:b.imageUrl||"",isActive:b.isActive!==false};const [row]=b.id?await db.update(vehicleTypes).set(values).where(eq(vehicleTypes.id,Number(b.id))).returning():await db.insert(vehicleTypes).values(values).returning();return Response.json({row},{status:b.id?200:201});}
  case "type.delete":{const used=await db.select({id:vehicles.id}).from(vehicles).where(eq(vehicles.typeId,Number(b.id))).limit(1);if(used.length)return fail(new Error("این مدل به خودروهای ثبت‌شده متصل است و قابل حذف نیست."),409);await db.delete(vehicleTypes).where(eq(vehicleTypes.id,Number(b.id)));return Response.json({ok:true});}
  case "driver.delete":{const active=await db.select({id:assignments.id}).from(assignments).where(and(eq(assignments.driverId,Number(b.id)),eq(assignments.status,"active"))).limit(1);if(active.length)return fail(new Error("راننده تخصیص فعال دارد و قابل حذف نیست."),409);await db.delete(drivers).where(eq(drivers.id,Number(b.id)));return Response.json({ok:true});}
  case "vehicle.request":{if(session.profile.role!=="driver")return fail(new Error("ثبت درخواست خودرو فقط از پنل راننده انجام می‌شود."),403);const driverId=Number(session.profile.driver_id),vehicleId=Number(b.vehicleId);if(!driverId||!vehicleId)return fail(new Error("خودرو را انتخاب کنید."),400);const [vehicle]=await db.select().from(vehicles).where(eq(vehicles.id,vehicleId)).limit(1);if(!vehicle||vehicle.status!=="ready")return fail(new Error("این خودرو دیگر آزاد نیست؛ یک پلاک دیگر انتخاب کنید."),409);const existing=await db.select({id:vehicleRequests.id}).from(vehicleRequests).where(and(eq(vehicleRequests.driverId,driverId),eq(vehicleRequests.status,"pending"))).limit(1);if(existing.length)return fail(new Error("شما یک درخواست در انتظار بررسی دارید."),409);const [row]=await db.insert(vehicleRequests).values({vehicleId,driverId,purpose:b.purpose||"",destination:b.destination||""}).returning();await db.insert(approvals).values({type:"vehicle_request",referenceId:row.id,title:`درخواست خودرو ${vehicle.title} — ${vehicle.plate}`,requestedBy:session.profile.full_name});const code=ticketCode();const [ticket]=await db.insert(tickets).values({code,subject:`درخواست خودرو ${vehicle.title}`,category:"vehicle_request",priority:"normal",vehicleId,driverId,reporter:session.profile.full_name,assignee:"سوپروایزر",description:`درخواست خودرو با پلاک ${vehicle.plate}${b.destination?` برای مقصد ${b.destination}`:""}${b.purpose?`؛ ${b.purpose}`:""}`}).returning();await db.insert(ticketMessages).values({ticketId:ticket.id,author:session.profile.full_name,authorRole:"driver",body:"درخواست خودرو ثبت و برای بررسی سوپروایزر ارسال شد."});await notify(db,"ticket_created",process.env.SUPERVISOR_PHONE||"09120000000",vehicle.title,code);return Response.json({row,ticket},{status:201});}
  case "assignment.create":{const vehicleId=Number(b.vehicleId),driverId=Number(b.driverId);const existing=(await db.select().from(assignments).where(eq(assignments.vehicleId,vehicleId))).find((a:any)=>['active','pending_return'].includes(a.status));if(existing)return fail(new Error("این خودرو هم‌اکنون در اختیار راننده دیگری است."),409);const [row]=await db.insert(assignments).values({vehicleId,driverId,startAt:b.startAt||now,expectedReturnAt:b.expectedReturnAt||null,assignmentType:b.assignmentType||"long_term",purpose:b.purpose||"",destination:b.destination||"",startMileage:Number(b.startMileage||0)}).returning();await db.update(vehicles).set({status:"assigned"}).where(eq(vehicles.id,vehicleId));const [[v],[d]]=await Promise.all([db.select().from(vehicles).where(eq(vehicles.id,vehicleId)).limit(1),db.select().from(drivers).where(eq(drivers.id,driverId)).limit(1)]);const code=ticketCode();const [t]=await db.insert(tickets).values({code,subject:`تخصیص ${v.title} به ${d.fullName}`,category:"assignment",priority:"normal",vehicleId,driverId,assignmentId:row.id,reporter:"سیستم",assignee:"سوپروایزر",description:`خودرو با پلاک ${v.plate} به‌صورت ${b.assignmentType==="mission"?"ماموریتی":"بلندمدت"} تحویل شد؛ تا تأیید نهایی عودت در اختیار ${d.fullName} باقی می‌ماند.`}).returning();await db.insert(ticketMessages).values({ticketId:t.id,author:"سامانه راهبر",authorRole:"system",body:`تخصیص با کیلومتر ${Number(b.startMileage||0).toLocaleString("fa-IR")} ثبت شد.`});await notify(db,"assignment",process.env.SUPERVISOR_PHONE||"09120000000",v.title,code);return Response.json({row,ticket:t},{status:201});}
  case "assignment.return":{const id=Number(b.id);const [a]=await db.select().from(assignments).where(eq(assignments.id,id)).limit(1);if(!a)return fail(new Error("تخصیص پیدا نشد"),404);if(session.profile.role==='driver'&&a.driverId!==Number(session.profile.driver_id))return fail(new Error("این تخصیص متعلق به شما نیست."),403);await db.update(assignments).set({status:"pending_return",returnRequestedAt:now,endAt:b.endAt||now,endMileage:Number(b.endMileage||0)}).where(eq(assignments.id,id));await db.update(vehicles).set({status:"pending",mileage:Number(b.endMileage||0)}).where(eq(vehicles.id,a.vehicleId));await db.insert(approvals).values({type:"return",referenceId:id,title:"تأیید عودت خودرو",requestedBy:session.profile.full_name});return Response.json({ok:true});}
  case "maintenance.create":{const [row]=await db.insert(maintenance).values({vehicleId:Number(b.vehicleId),title:b.title,dueDate:b.dueDate,dueMileage:b.dueMileage?Number(b.dueMileage):null,cost:Number(b.cost||0),vendor:b.vendor||"",notes:b.notes||""}).returning();return Response.json({row},{status:201});}
  case "maintenance.complete":{const id=Number(b.id);await db.update(maintenance).set({status:"pending_approval",completedAt:now,cost:Number(b.cost||0),vendor:b.vendor||""}).where(eq(maintenance.id,id));await db.insert(approvals).values({type:"maintenance",referenceId:id,title:"تأیید انجام سرویس",requestedBy:b.requestedBy||"مدیر ناوگان"});return Response.json({ok:true});}
  case "approval.resolve":{const id=Number(b.id);const [p]=await db.select().from(approvals).where(eq(approvals.id,id)).limit(1);if(!p)return fail(new Error("درخواست پیدا نشد"),404);if(p.type==="vehicle_request"){const [vr]=await db.select().from(vehicleRequests).where(eq(vehicleRequests.id,p.referenceId)).limit(1);if(!vr)return fail(new Error("درخواست خودرو پیدا نشد."),404);if(b.approved){const [vehicle]=await db.select().from(vehicles).where(eq(vehicles.id,vr.vehicleId)).limit(1);if(!vehicle||vehicle.status!=="ready")return fail(new Error("این خودرو دیگر آزاد نیست؛ درخواست را رد کنید تا راننده پلاک دیگری انتخاب کند."),409);await db.insert(assignments).values({vehicleId:vr.vehicleId,driverId:vr.driverId,startAt:now,assignmentType:"long_term",purpose:vr.purpose,destination:vr.destination,startMileage:vehicle.mileage,status:"active"});await db.update(vehicles).set({status:"assigned"}).where(eq(vehicles.id,vr.vehicleId));}await db.update(vehicleRequests).set({status:b.approved?"approved":"rejected",supervisorNote:b.note||"",resolvedAt:now}).where(eq(vehicleRequests.id,vr.id));}else if(p.type==="return"){const [a]=await db.select().from(assignments).where(eq(assignments.id,p.referenceId)).limit(1);if(a){await db.update(assignments).set({status:b.approved?"returned":"active",endAt:b.approved?a.endAt:null,endMileage:b.approved?a.endMileage:null,returnedApprovedAt:b.approved?now:null,returnRequestedAt:b.approved?a.returnRequestedAt:null}).where(eq(assignments.id,a.id));await db.update(vehicles).set({status:b.approved?"ready":"assigned"}).where(eq(vehicles.id,a.vehicleId));}}else await db.update(maintenance).set({status:b.approved?"completed":"scheduled",completedAt:b.approved?now:null}).where(eq(maintenance.id,p.referenceId));await db.update(approvals).set({status:b.approved?"approved":"rejected",supervisorNote:b.note||"",resolvedAt:now}).where(eq(approvals.id,id));await notify(db,"approval",process.env.SUPERVISOR_PHONE||"09120000000",b.approved?"تایید":"رد",`APR-${id}`);return Response.json({ok:true});}
  case "ticket.create":{const code=ticketCode(),isDriver=session.profile.role==='driver',driverId=isDriver?Number(session.profile.driver_id):(b.driverId?Number(b.driverId):null);if(isDriver&&b.vehicleId){const owns=await db.select({id:assignments.id}).from(assignments).where(and(eq(assignments.driverId,Number(driverId)),eq(assignments.vehicleId,Number(b.vehicleId)))).limit(1);if(!owns.length)return fail(new Error("این خودرو در سوابق شما نیست."),403)}const [row]=await db.insert(tickets).values({code,subject:b.subject,category:b.category||"general",priority:b.priority||"normal",vehicleId:b.vehicleId?Number(b.vehicleId):null,driverId,assignmentId:b.assignmentId?Number(b.assignmentId):null,reporter:session.profile.full_name,assignee:b.assignee||"سوپروایزر",description:b.description||""}).returning();await db.insert(ticketMessages).values({ticketId:row.id,author:session.profile.full_name,authorRole:session.profile.role,body:b.description||"تیکت ایجاد شد."});await notify(db,"ticket_created",process.env.SUPERVISOR_PHONE||"09120000000",b.subject,code);return Response.json({row},{status:201});}
  case "ticket.message":{const id=Number(b.ticketId);const [t]=await db.select().from(tickets).where(eq(tickets.id,id)).limit(1);if(!t)return fail(new Error("تیکت پیدا نشد"),404);const [row]=await db.insert(ticketMessages).values({ticketId:id,author:b.author||"مدیریت",authorRole:b.authorRole||"management",body:b.body}).returning();await db.update(tickets).set({updatedAt:now,status:t.status==="closed"?"open":t.status}).where(eq(tickets.id,id));await notify(db,"ticket_message",process.env.SUPERVISOR_PHONE||"09120000000","پاسخ-جدید",t.code);return Response.json({row},{status:201});}
  case "ticket.status":{const id=Number(b.id);const [t]=await db.select().from(tickets).where(eq(tickets.id,id)).limit(1);if(!t)return fail(new Error("تیکت پیدا نشد"),404);await db.update(tickets).set({status:b.status,updatedAt:now,closedAt:b.status==="closed"?now:null}).where(eq(tickets.id,id));await db.insert(ticketMessages).values({ticketId:id,author:b.author||"مدیریت",authorRole:"management",body:`وضعیت تیکت به «${b.status}» تغییر کرد.`});await notify(db,"ticket_status",process.env.SUPERVISOR_PHONE||"09120000000",b.status,t.code);return Response.json({ok:true});}
  default:return fail(new Error("عملیات نامعتبر است"),400);
 }}catch(e){const m=e instanceof Error?e.message:"";return fail(new Error(m.includes("UNIQUE")?"این پلاک یا کد شناسایی قبلاً ثبت شده است.":m));}
}
