/**
 * Shared customer/admin tokenization contract.
 * Metadata describes information to collect, never a legal approval or permission to issue.
 * Numeric amounts remain canonical decimal strings throughout the request lifecycle.
 */
export type AssetCategory = "tangible" | "intangible";
export type AssetField = {
  key: string; label: string; type: "text" | "textarea" | "number" | "date" | "select";
  required: boolean; unit?: string; options?: { value: string; label: string }[];
  maxLength?: number; integer?: boolean; maxIntegerDigits?: number; maxFractionDigits?: number;
  min?: string; max?: string; exclusiveMin?: boolean;
};
export type AssetDocumentSlot = {
  key: string; label: string; description: string; required: boolean; group: string;
};
export type AssetType = {
  id: string; category: AssetCategory; title: string; description: string; icon: string;
  fields: AssetField[]; documents: AssetDocumentSlot[];
};
export type TokenizationStatus = "draft" | "submitted" | "under_review" | "changes_requested" | "rejected" | "awaiting_acceptance" | "issuance_pending" | "issued";
export type ReviewStatus = "pending" | "approved" | "changes_requested" | "rejected";
export type TokenizationReview = { status: ReviewStatus; message: string; updated_at?: string };
export type TokenizationDocument = {
  id: string; slot: string; name: string; mime: string; size: number;
  status: "uploaded" | "approved" | "changes_requested" | "rejected"; message?: string; created_at?: string;
};
export type Tokenomics = {
  name: string; symbol: string; total_supply: string; decimals: number; unit_price_rial: string;
  network: string; chain_id: number; rights: string; transfer_policy: string;
  redemption_policy: string; risk_disclosure: string;
  allocations: { label: string; percent: number; lock_months: number }[];
  wallet_destination: "internal";
  /** Reserved for a server-resolved destination; not accepted from a proposal editor. */
  recipient_address?: string;
};
export type Issuance = {
  status: "pending" | "confirmed" | "failed"; transaction_hash?: string;
  contract_address?: string; chain_id?: number; recipient_address?: string;
  amount?: string; confirmed_at?: string; message?: string;
};
export type TokenizationProgress = {
  filled_fields: number; total_fields: number; required_fields: number; completed_required_fields: number;
  uploaded_documents: number; required_documents: number; uploaded_required_documents: number; current_step: number;
};
export type TokenizationRequest = {
  id: string; user_id?: string; version: number; status: TokenizationStatus;
  asset_type: string; fields: Record<string, string>; terms_version: string | null;
  submitted_at: string | null; created_at: string; updated_at: string;
  message?: string; consented_at?: string | null; accepted_at?: string | null;
  wizard_step?: number | null; progress?: TokenizationProgress;
  documents: TokenizationDocument[];
  reviews: { legal: TokenizationReview; financial: TokenizationReview; technical: TokenizationReview };
  tokenomics: Tokenomics | null; proposal_version: number;
  accepted_proposal_version: number | null; issuance: Issuance | null;
};
export type TokenizationAdminReview = TokenizationReview & { internal_note?: string; reviewer_id?: string };
export type TokenizationAdminRequest = Omit<TokenizationRequest, "reviews"> & {
  reviews: { legal: TokenizationAdminReview; financial: TokenizationAdminReview; technical: TokenizationAdminReview };
  internal_notes?: { id: string; message: string; created_at: string; author_id?: string }[];
};

export const categoryLabels: Record<AssetCategory, string> = { tangible: "دارایی‌های مشهود", intangible: "دارایی‌های نامشهود" };
export const statusLabels: Record<TokenizationStatus, string> = {
  draft: "پیش‌نویس", submitted: "ارسال‌شده", under_review: "در حال بررسی",
  changes_requested: "نیازمند اصلاح", rejected: "رد شده", awaiting_acceptance: "در انتظار پذیرش پیشنهاد",
  issuance_pending: "در انتظار صدور", issued: "صادر شده",
};
export const reviewLabels: Record<ReviewStatus, string> = {
  pending: "در انتظار بررسی", approved: "تأیید بررسی", changes_requested: "نیازمند اصلاح", rejected: "رد شده",
};
export const TERMS_VERSION = "2026-09-24-v1";
export const termsSections: { title: string; text: string }[] = [
  { title: "صحت اطلاعات و اختیار اقدام", text: "با ارسال درخواست اعلام می‌کنید اطلاعات و مدارک تا حد اطلاع شما صحیح است و برای معرفی دارایی و درخواست بررسی آن اختیار دارید. ادعای مالکیت شما جداگانه بررسی می‌شود." },
  { title: "بررسی مستقل دارایی", text: "ثبت درخواست و بارگذاری مدارک به معنی تأیید حقوقی، ارزش‌گذاری قطعی، دریافت مجوز یا تعهد به صدور توکن نیست. ممکن است مدارک تکمیلی، استعلام یا اصلاح اطلاعات لازم شود." },
  { title: "مدارک و حریم خصوصی", text: "مدارک این پرونده برای بررسی در اختیار کارشناسان مجاز قرار می‌گیرد. فقط اطلاعات لازم را ارسال کنید؛ رمز عبور، کلید خصوصی و اطلاعات نامرتبط را در فایل‌ها قرار ندهید." },
  { title: "پیشنهاد توکنومیکس", text: "تعداد و نوع توکن، شبکه، حقوق دارندگان، محدودیت انتقال، شرایط بازخرید و ریسک‌ها در پیشنهاد جداگانه مشخص می‌شود. صدور نیازمند پذیرش صریح نسخه نهایی پیشنهاد توسط شماست؛ تغییر پیشنهاد، پذیرش مجدد می‌خواهد." },
  { title: "هزینه‌ها و عرضه", text: "ارسال درخواست به خودی خود مجوز برداشت وجه یا تضمین تأمین مالی، فروش، نقدشوندگی یا سود نیست. هر هزینه و تعهد اجرایی باید پیش از اجرا به‌صورت روشن اعلام و جداگانه پذیرفته شود." },
  { title: "صدور و کیف پول داخلی", text: "مقصد این فرایند کیف پول داخلی شما در پلانک است. ثبت درخواست صدور، تأیید صدور محسوب نمی‌شود؛ نمایش توکن صادرشده و ثبت موجودی فقط پس از بررسی نتیجه واقعی صدور انجام می‌شود." },
];

export const commonFields: AssetField[] = [
  {
    "key": "title",
    "label": "عنوان دارایی یا پروژه",
    "type": "text",
    "required": true,
    "maxLength": 120
  },
  {
    "key": "owner_name",
    "label": "نام مالک یا نام ثبتی شرکت",
    "type": "text",
    "required": true,
    "maxLength": 160
  },
  {
    "key": "owner_type",
    "label": "نوع مالک",
    "type": "select",
    "required": true,
    "options": [
      {
        "value": "owner",
        "label": "شخص حقیقی"
      },
      {
        "value": "company",
        "label": "شخص حقوقی"
      }
    ]
  },
  {
    "key": "country",
    "label": "کشور",
    "type": "text",
    "required": true,
    "maxLength": 80
  },
  {
    "key": "city",
    "label": "شهر یا منطقه",
    "type": "text",
    "required": true,
    "maxLength": 100
  },
  {
    "key": "address",
    "label": "نشانی محل دارایی یا نشانی مالک",
    "type": "textarea",
    "required": true,
    "maxLength": 600
  },
  {
    "key": "summary",
    "label": "معرفی دارایی و حقوق پیشنهادی",
    "type": "textarea",
    "required": true,
    "maxLength": 4000
  },
  {
    "key": "estimated_value_rial",
    "label": "ارزش برآوردی دارایی",
    "type": "number",
    "required": true,
    "unit": "ریال",
    "min": "0",
    "exclusiveMin": true,
    "maxIntegerDigits": 24,
    "maxFractionDigits": 0,
    "integer": true
  }
];

export const assetTypes: AssetType[] = [
  {
    "id": "solar_plant",
    "category": "tangible",
    "title": "نیروگاه خورشیدی",
    "description": "دارایی نیروگاه، تجهیزات و حقوق بهره‌برداری یا درآمد پروژه.",
    "icon": "Sun",
    "fields": [
      {
        "key": "capacity_mw",
        "label": "ظرفیت نامی نیروگاه",
        "type": "number",
        "required": true,
        "unit": "مگاوات",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 18,
        "maxFractionDigits": 6
      },
      {
        "key": "land_area_m2",
        "label": "مساحت زمین",
        "type": "number",
        "required": true,
        "unit": "متر مربع",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 18,
        "maxFractionDigits": 6
      },
      {
        "key": "project_stage",
        "label": "مرحله پروژه",
        "type": "select",
        "required": true,
        "options": [
          {
            "value": "planning",
            "label": "در حال برنامه‌ریزی"
          },
          {
            "value": "construction",
            "label": "در حال ساخت"
          },
          {
            "value": "operational",
            "label": "در حال بهره‌برداری"
          }
        ]
      },
      {
        "key": "grid_connection",
        "label": "وضعیت اتصال به شبکه",
        "type": "textarea",
        "required": true,
        "maxLength": 1200
      },
      {
        "key": "power_contract",
        "label": "وضعیت قرارداد فروش برق",
        "type": "textarea",
        "required": true,
        "maxLength": 1200
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "energy_license",
        "label": "مجوزها یا درخواست‌های نیروگاهی",
        "description": "مجوزهای موجود یا مدارک درخواست و وضعیت بررسی آن‌ها؛ تأیید اخذشده فرض نمی‌شود.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "grid_documents",
        "label": "اسناد اتصال و فروش برق",
        "description": "اسناد موجود اتصال شبکه یا قرارداد خرید برق.",
        "required": false,
        "group": "مدارک تخصصی"
      },
      {
        "key": "technical_plan",
        "label": "طرح فنی و مشخصات تجهیزات",
        "description": "طرح نیروگاه، ظرفیت و مشخصات پنل‌ها و تجهیزات.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "land_rights",
        "label": "حق استفاده از زمین",
        "description": "سند زمین، اجاره‌نامه یا قرارداد حق بهره‌برداری.",
        "required": true,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "real_estate",
    "category": "tangible",
    "title": "ملک مسکونی و مجتمع",
    "description": "واحد مسکونی، ساختمان یا مجتمع و حقوق مشخص مرتبط با آن.",
    "icon": "Building2",
    "fields": [
      {
        "key": "registration_number",
        "label": "شناسه یا پلاک ثبتی",
        "type": "text",
        "required": true,
        "maxLength": 100
      },
      {
        "key": "built_area_m2",
        "label": "زیربنا",
        "type": "number",
        "required": true,
        "unit": "متر مربع",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 18,
        "maxFractionDigits": 6
      },
      {
        "key": "units_count",
        "label": "تعداد واحد",
        "type": "number",
        "required": true,
        "unit": "واحد",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 7,
        "maxFractionDigits": 0,
        "integer": true
      },
      {
        "key": "construction_status",
        "label": "وضعیت ساختمان",
        "type": "select",
        "required": true,
        "options": [
          {
            "value": "planned",
            "label": "طرح"
          },
          {
            "value": "under_construction",
            "label": "در حال ساخت"
          },
          {
            "value": "completed",
            "label": "تکمیل‌شده"
          }
        ]
      },
      {
        "key": "encumbrances",
        "label": "بدهی، رهن یا محدودیت مالکیت",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "property_title",
        "label": "سند و مشخصات ثبتی",
        "description": "صفحات مرتبط سند و مشخصات ثبتی ملک.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "building_permit",
        "label": "مدارک ساخت یا پایان کار",
        "description": "مجوز ساخت یا مدارک وضعیت پایان کار موجود.",
        "required": false,
        "group": "مدارک تخصصی"
      },
      {
        "key": "property_plan",
        "label": "نقشه و مشخصات ملک",
        "description": "نقشه، مشخصات زیربنا و تصاویر قابل بررسی.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "lease_contracts",
        "label": "قراردادهای اجاره",
        "description": "قراردادهای اجاره و تعهدات موجود، در صورت وجود.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "land",
    "category": "tangible",
    "title": "زمین",
    "description": "قطعه زمین و حقوق مالکیت یا بهره‌برداری تعریف‌شده.",
    "icon": "MapPinned",
    "fields": [
      {
        "key": "registration_number",
        "label": "شناسه یا پلاک ثبتی",
        "type": "text",
        "required": true,
        "maxLength": 100
      },
      {
        "key": "area_m2",
        "label": "مساحت زمین",
        "type": "number",
        "required": true,
        "unit": "متر مربع",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 18,
        "maxFractionDigits": 6
      },
      {
        "key": "land_use",
        "label": "کاربری فعلی و مجاز",
        "type": "text",
        "required": true,
        "maxLength": 300
      },
      {
        "key": "access_utilities",
        "label": "دسترسی و خدمات زیرساخت",
        "type": "textarea",
        "required": false,
        "maxLength": 1200
      },
      {
        "key": "encumbrances",
        "label": "رهن، حق ارتفاق و محدودیت‌ها",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "land_title",
        "label": "سند یا حق بهره‌برداری زمین",
        "description": "سند یا قرارداد معتبر ادعای حق روی زمین.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "cadastral_map",
        "label": "نقشه و حدود زمین",
        "description": "نقشه ثبتی، مختصات یا مدارک قابل اتکای حدود زمین.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "land_use_documents",
        "label": "مدارک کاربری",
        "description": "اسناد کاربری یا مکاتبات مربوط، در صورت وجود.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "commercial_property",
    "category": "tangible",
    "title": "ملک تجاری، مال و مرکز خرید",
    "description": "فضای تجاری، مرکز خرید و حقوق درآمد یا مالکیت آن.",
    "icon": "Store",
    "fields": [
      {
        "key": "registration_number",
        "label": "شناسه یا پلاک ثبتی",
        "type": "text",
        "required": true,
        "maxLength": 100
      },
      {
        "key": "rentable_area_m2",
        "label": "مساحت قابل بهره‌برداری",
        "type": "number",
        "required": true,
        "unit": "متر مربع",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 18,
        "maxFractionDigits": 6
      },
      {
        "key": "units_count",
        "label": "تعداد واحد تجاری",
        "type": "number",
        "required": true,
        "unit": "واحد",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 7,
        "maxFractionDigits": 0,
        "integer": true
      },
      {
        "key": "occupancy_percent",
        "label": "درصد بهره‌برداری فعلی",
        "type": "number",
        "required": true,
        "unit": "درصد",
        "min": "0",
        "exclusiveMin": false,
        "maxIntegerDigits": 18,
        "maxFractionDigits": 2,
        "max": "100"
      },
      {
        "key": "lease_summary",
        "label": "خلاصه قراردادها و تعهدات اجاره",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "commercial_title",
        "label": "سند و حقوق تجاری",
        "description": "سند ملک یا قرارداد حقوق تجاری قابل بررسی.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "operating_documents",
        "label": "اسناد وضعیت بهره‌برداری",
        "description": "مجوزها و اسناد بهره‌برداری موجود.",
        "required": false,
        "group": "مدارک تخصصی"
      },
      {
        "key": "lease_schedule",
        "label": "فهرست اجاره‌ها و درآمد",
        "description": "خلاصه قراردادها، درآمد و هزینه‌های مستند.",
        "required": true,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "agriculture",
    "category": "tangible",
    "title": "مزرعه و محصولات کشاورزی",
    "description": "زمین کشاورزی، تولید یا محصول با حقوق و دوره مشخص.",
    "icon": "Sprout",
    "fields": [
      {
        "key": "crop_type",
        "label": "نوع محصول یا فعالیت",
        "type": "text",
        "required": true,
        "maxLength": 200
      },
      {
        "key": "area_hectares",
        "label": "سطح زیر کشت",
        "type": "number",
        "required": true,
        "unit": "هکتار",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 18,
        "maxFractionDigits": 6
      },
      {
        "key": "water_rights",
        "label": "منبع آب و حقوق استفاده",
        "type": "textarea",
        "required": true,
        "maxLength": 1500
      },
      {
        "key": "production_cycle",
        "label": "دوره تولید و برداشت",
        "type": "text",
        "required": true,
        "maxLength": 300
      },
      {
        "key": "storage_transport",
        "label": "نگهداری و حمل محصول",
        "type": "textarea",
        "required": false,
        "maxLength": 1200
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "farm_rights",
        "label": "اسناد زمین و بهره‌برداری",
        "description": "اسناد مالکیت یا قرارداد بهره‌برداری کشاورزی.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "water_documents",
        "label": "مدارک حق آب",
        "description": "اسناد یا قراردادهای موجود مربوط به دسترسی آب.",
        "required": false,
        "group": "مدارک تخصصی"
      },
      {
        "key": "production_plan",
        "label": "برنامه تولید و فروش",
        "description": "برآورد تولید، هزینه و مسیر فروش محصول.",
        "required": true,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "machinery",
    "category": "tangible",
    "title": "ماشین‌آلات و تجهیزات",
    "description": "تجهیزات صنعتی یا عملیاتی با هویت و وضعیت فنی مشخص.",
    "icon": "Factory",
    "fields": [
      {
        "key": "manufacturer_model",
        "label": "سازنده و مدل",
        "type": "text",
        "required": true,
        "maxLength": 200
      },
      {
        "key": "serial_number",
        "label": "شماره سریال یا شناسه تجهیز",
        "type": "text",
        "required": true,
        "maxLength": 160
      },
      {
        "key": "manufacture_year",
        "label": "سال ساخت میلادی",
        "type": "number",
        "required": true,
        "unit": "سال",
        "min": "1800",
        "exclusiveMin": false,
        "maxIntegerDigits": 4,
        "maxFractionDigits": 0,
        "integer": true,
        "max": "2200"
      },
      {
        "key": "condition",
        "label": "وضعیت فنی و نگهداری",
        "type": "textarea",
        "required": true,
        "maxLength": 1600
      },
      {
        "key": "quantity",
        "label": "تعداد تجهیزات",
        "type": "number",
        "required": true,
        "unit": "عدد",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 9,
        "maxFractionDigits": 0,
        "integer": true
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "equipment_invoice",
        "label": "فاکتور یا سند تملک",
        "description": "مدرک خرید، ورود یا انتقال مالکیت تجهیزات.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "technical_inspection",
        "label": "گزارش فنی موجود",
        "description": "گزارش بازدید، مشخصات فنی و سوابق تعمیر.",
        "required": false,
        "group": "مدارک تخصصی"
      },
      {
        "key": "equipment_photos",
        "label": "تصاویر و شناسه تجهیزات",
        "description": "تصاویر تجهیزات و شماره‌های شناسایی خوانا.",
        "required": true,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "vehicles",
    "category": "tangible",
    "title": "خودرو و ناوگان",
    "description": "خودرو، وسیله نقلیه یا ناوگان با اسناد مالکیت مشخص.",
    "icon": "CarFront",
    "fields": [
      {
        "key": "vehicle_type",
        "label": "نوع وسیله نقلیه",
        "type": "text",
        "required": true,
        "maxLength": 150
      },
      {
        "key": "manufacturer_model",
        "label": "سازنده و مدل",
        "type": "text",
        "required": true,
        "maxLength": 200
      },
      {
        "key": "vehicle_identifiers",
        "label": "شناسه خودرو یا فهرست ناوگان",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      },
      {
        "key": "vehicle_count",
        "label": "تعداد وسایل نقلیه",
        "type": "number",
        "required": true,
        "unit": "دستگاه",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 7,
        "maxFractionDigits": 0,
        "integer": true
      },
      {
        "key": "condition",
        "label": "وضعیت فنی و بهره‌برداری",
        "type": "textarea",
        "required": true,
        "maxLength": 1600
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "vehicle_titles",
        "label": "اسناد مالکیت ناوگان",
        "description": "اسناد مالکیت یا قراردادهای تملک وسایل نقلیه.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "insurance_documents",
        "label": "بیمه و معاینه فنی",
        "description": "اسناد موجود بیمه و معاینه فنی.",
        "required": false,
        "group": "مدارک تخصصی"
      },
      {
        "key": "fleet_schedule",
        "label": "مشخصات و فهرست ناوگان",
        "description": "فهرست شناسه، مدل و وضعیت هر وسیله.",
        "required": true,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "precious_metals",
    "category": "tangible",
    "title": "فلزات و کالاهای گران‌بها",
    "description": "طلا، نقره، پلاتین یا فلز مشخص با وزن، عیار و محل نگهداری.",
    "icon": "Gem",
    "fields": [
      {
        "key": "metal_type",
        "label": "نوع فلز",
        "type": "select",
        "required": true,
        "options": [
          {
            "value": "gold",
            "label": "طلا"
          },
          {
            "value": "silver",
            "label": "نقره"
          },
          {
            "value": "platinum",
            "label": "پلاتین"
          },
          {
            "value": "copper",
            "label": "مس"
          },
          {
            "value": "other",
            "label": "سایر فلزات"
          }
        ]
      },
      {
        "key": "weight_kg",
        "label": "وزن خالص",
        "type": "number",
        "required": true,
        "unit": "کیلوگرم",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 18,
        "maxFractionDigits": 6
      },
      {
        "key": "purity",
        "label": "عیار یا درجه خلوص",
        "type": "text",
        "required": true,
        "maxLength": 120
      },
      {
        "key": "custodian",
        "label": "متولی و محل نگهداری",
        "type": "textarea",
        "required": true,
        "maxLength": 1600
      },
      {
        "key": "delivery_terms",
        "label": "شرایط تحویل فیزیکی",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "purchase_evidence",
        "label": "اسناد خرید و مالکیت",
        "description": "فاکتور یا اسناد منشأ و مالکیت کالا.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "assay_certificate",
        "label": "گواهی عیار یا مشخصات کالا",
        "description": "گواهی موجود آزمایش یا مشخصات قابل بررسی کالا.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "custody_evidence",
        "label": "اسناد نگهداری",
        "description": "رسید انبار یا قرارداد نگهداری و تحویل.",
        "required": true,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "art",
    "category": "tangible",
    "title": "اثر هنری و مجموعه",
    "description": "اثر فیزیکی یا مجموعه دارای سابقه مالکیت و مشخصات اصالت.",
    "icon": "Palette",
    "fields": [
      {
        "key": "creator",
        "label": "نام هنرمند یا سازنده",
        "type": "text",
        "required": true,
        "maxLength": 160
      },
      {
        "key": "work_details",
        "label": "عنوان، تاریخ و مشخصات اثر",
        "type": "textarea",
        "required": true,
        "maxLength": 1800
      },
      {
        "key": "provenance",
        "label": "سابقه مالکیت و منشأ",
        "type": "textarea",
        "required": true,
        "maxLength": 2200
      },
      {
        "key": "condition",
        "label": "وضعیت اثر و محل نگهداری",
        "type": "textarea",
        "required": true,
        "maxLength": 1600
      },
      {
        "key": "rights_scope",
        "label": "حقوق قابل واگذاری و حقوق مستثنا",
        "type": "textarea",
        "required": true,
        "maxLength": 2200
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "provenance_documents",
        "label": "اسناد سابقه مالکیت",
        "description": "فاکتور، قرارداد انتقال یا سوابق مجموعه.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "authenticity_documents",
        "label": "شواهد اصالت موجود",
        "description": "گواهی یا نظر کارشناسی موجود؛ اصالت خودکار تأیید نمی‌شود.",
        "required": false,
        "group": "مدارک تخصصی"
      },
      {
        "key": "art_photos",
        "label": "تصاویر و مشخصات اثر",
        "description": "تصاویر واضح و مشخصات فیزیکی اثر.",
        "required": true,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "oil_project",
    "category": "tangible",
    "title": "پروژه نفت و انرژی",
    "description": "تجهیزات، پروژه یا حق درآمد مشخص در زنجیره نفت و انرژی.",
    "icon": "Fuel",
    "fields": [
      {
        "key": "project_scope",
        "label": "محدوده پروژه و نوع دارایی",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      },
      {
        "key": "concession_rights",
        "label": "ماهیت حق بهره‌برداری",
        "type": "textarea",
        "required": true,
        "maxLength": 2200
      },
      {
        "key": "capacity",
        "label": "ظرفیت و واحد اندازه‌گیری",
        "type": "text",
        "required": true,
        "maxLength": 300
      },
      {
        "key": "project_stage",
        "label": "مرحله پروژه",
        "type": "select",
        "required": true,
        "options": [
          {
            "value": "planning",
            "label": "برنامه‌ریزی"
          },
          {
            "value": "construction",
            "label": "ساخت"
          },
          {
            "value": "operational",
            "label": "بهره‌برداری"
          }
        ]
      },
      {
        "key": "offtake_status",
        "label": "وضعیت فروش و قراردادهای درآمد",
        "type": "textarea",
        "required": true,
        "maxLength": 1800
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "project_rights",
        "label": "قرارداد حقوق پروژه",
        "description": "قرارداد امتیاز، مالکیت یا بهره‌برداری مورد ادعا.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "technical_report",
        "label": "گزارش فنی پروژه",
        "description": "مشخصات تجهیزات، ظرفیت و برنامه عملیاتی.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "environmental_documents",
        "label": "اسناد محیط‌زیستی موجود",
        "description": "ارزیابی یا مجوزهای موجود، در صورت وجود.",
        "required": false,
        "group": "مدارک تخصصی"
      },
      {
        "key": "offtake_contracts",
        "label": "قراردادهای فروش",
        "description": "قراردادهای فروش یا دریافت درآمد موجود.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "wind_farm",
    "category": "tangible",
    "title": "نیروگاه بادی",
    "description": "توربین‌ها و حقوق پروژه تولید برق بادی.",
    "icon": "Wind",
    "fields": [
      {
        "key": "capacity_mw",
        "label": "ظرفیت نامی",
        "type": "number",
        "required": true,
        "unit": "مگاوات",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 18,
        "maxFractionDigits": 6
      },
      {
        "key": "turbine_count",
        "label": "تعداد توربین",
        "type": "number",
        "required": true,
        "unit": "دستگاه",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 6,
        "maxFractionDigits": 0,
        "integer": true
      },
      {
        "key": "wind_resource",
        "label": "مطالعات باد و موقعیت سایت",
        "type": "textarea",
        "required": true,
        "maxLength": 1800
      },
      {
        "key": "land_rights",
        "label": "وضعیت حقوق زمین",
        "type": "textarea",
        "required": true,
        "maxLength": 1400
      },
      {
        "key": "power_contract",
        "label": "وضعیت قرارداد فروش برق",
        "type": "textarea",
        "required": true,
        "maxLength": 1800
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "wind_study",
        "label": "مطالعه و طرح فنی",
        "description": "مطالعه باد و مشخصات توربین‌ها.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "energy_license",
        "label": "اسناد مجوز یا درخواست",
        "description": "مجوزهای موجود یا مستند وضعیت درخواست.",
        "required": false,
        "group": "مدارک تخصصی"
      },
      {
        "key": "grid_documents",
        "label": "اسناد اتصال و فروش برق",
        "description": "اسناد موجود اتصال شبکه یا فروش برق.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "infrastructure",
    "category": "tangible",
    "title": "زیرساخت و مجموعه تفریحی",
    "description": "زیرساخت خدماتی، شهر بازی یا مجموعه با حق درآمد و بهره‌برداری.",
    "icon": "FerrisWheel",
    "fields": [
      {
        "key": "infrastructure_type",
        "label": "نوع زیرساخت یا مجموعه",
        "type": "text",
        "required": true,
        "maxLength": 200
      },
      {
        "key": "operating_rights",
        "label": "نوع و مدت حق بهره‌برداری",
        "type": "textarea",
        "required": true,
        "maxLength": 1800
      },
      {
        "key": "revenue_model",
        "label": "مدل درآمد و هزینه",
        "type": "textarea",
        "required": true,
        "maxLength": 2200
      },
      {
        "key": "safety_status",
        "label": "وضعیت ایمنی و کنترل‌های موجود",
        "type": "textarea",
        "required": true,
        "maxLength": 1800
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "operating_contract",
        "label": "قرارداد بهره‌برداری",
        "description": "قرارداد حقوق بهره‌برداری و مدت آن.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "technical_plan",
        "label": "طرح فنی و دارایی‌ها",
        "description": "شرح تجهیزات، ظرفیت و وضعیت پروژه.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "safety_documents",
        "label": "گزارش‌ها و مجوزهای ایمنی",
        "description": "مدارک موجود ایمنی یا وضعیت درخواست.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "mining_project",
    "category": "tangible",
    "title": "معدن و پروژه معدنی",
    "description": "پروژه استخراج، تجهیزات یا حقوق بهره‌برداری مشخص.",
    "icon": "Mountain",
    "fields": [
      {
        "key": "mineral_type",
        "label": "ماده معدنی",
        "type": "text",
        "required": true,
        "maxLength": 160
      },
      {
        "key": "permit_scope",
        "label": "محدوده و نوع حق معدنی",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      },
      {
        "key": "resource_estimate",
        "label": "برآورد ذخیره و مبنای آن",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      },
      {
        "key": "operating_stage",
        "label": "وضعیت عملیات و زیرساخت",
        "type": "textarea",
        "required": true,
        "maxLength": 1800
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "mining_rights",
        "label": "اسناد حقوق معدنی",
        "description": "پروانه یا قرارداد حقوق مورد ادعا و اعتبار آن.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "geological_report",
        "label": "گزارش زمین‌شناسی یا فنی",
        "description": "گزارش موجود درباره ماده معدنی و برآورد ذخیره.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "environmental_documents",
        "label": "اسناد محیط‌زیست",
        "description": "اسناد موجود ارزیابی و الزامات محیط‌زیستی.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "startup",
    "category": "intangible",
    "title": "استارتاپ",
    "description": "حقوق قابل واگذاری یک کسب‌وکار نوپا با ساختار حقوقی روشن.",
    "icon": "Rocket",
    "fields": [
      {
        "key": "business_model",
        "label": "مدل کسب‌وکار",
        "type": "textarea",
        "required": true,
        "maxLength": 2500
      },
      {
        "key": "incorporation_details",
        "label": "وضعیت ثبت و شخصیت حقوقی",
        "type": "textarea",
        "required": true,
        "maxLength": 1800
      },
      {
        "key": "ownership_structure",
        "label": "ساختار سهام‌داری و حقوق قابل عرضه",
        "type": "textarea",
        "required": true,
        "maxLength": 2500
      },
      {
        "key": "traction",
        "label": "عملکرد قابل استناد",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      },
      {
        "key": "funding_use",
        "label": "محل مصرف منابع",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "pitch_deck",
        "label": "معرفی و برنامه کسب‌وکار",
        "description": "شرح محصول، بازار، برنامه و نیاز مالی.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "corporate_documents",
        "label": "اسناد ثبت و سهام‌داری",
        "description": "اسناد موجود شخصیت حقوقی و جدول سهام‌داری.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "financial_statements",
        "label": "گزارش مالی موجود",
        "description": "گزارش درآمد، هزینه یا صورت‌های مالی موجود.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "company_shares",
    "category": "intangible",
    "title": "سهام و حقوق شرکت",
    "description": "سهام یا حقوق اقتصادی یک شرکت با قابلیت انتقال قابل بررسی.",
    "icon": "BriefcaseBusiness",
    "fields": [
      {
        "key": "registration_number",
        "label": "شناسه ثبتی شرکت",
        "type": "text",
        "required": true,
        "maxLength": 120
      },
      {
        "key": "share_class",
        "label": "نوع سهم یا حقوق پیشنهادی",
        "type": "text",
        "required": true,
        "maxLength": 300
      },
      {
        "key": "shares_count",
        "label": "تعداد سهام موضوع درخواست",
        "type": "number",
        "required": true,
        "unit": "سهم",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 18,
        "maxFractionDigits": 0,
        "integer": true
      },
      {
        "key": "transfer_restrictions",
        "label": "محدودیت انتقال و حقوق دیگران",
        "type": "textarea",
        "required": true,
        "maxLength": 2200
      },
      {
        "key": "ownership_structure",
        "label": "ساختار سرمایه و سهام‌داری",
        "type": "textarea",
        "required": true,
        "maxLength": 2200
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "corporate_documents",
        "label": "اسناد ثبت و اساسنامه",
        "description": "اسناد ثبت، اساسنامه و تغییرات مرتبط.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "share_register",
        "label": "مدارک مالکیت سهام",
        "description": "دفتر سهام یا مدارک معتبر حق مورد ادعا.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "financial_statements",
        "label": "صورت‌های مالی",
        "description": "صورت‌های مالی و توضیحات دوره مورد بررسی.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "board_authorization",
        "label": "مجوز اقدام یا انتقال",
        "description": "مصوبه یا مدرک اختیار اقدام در صورت نیاز.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "intellectual_property",
    "category": "intangible",
    "title": "مالکیت فکری",
    "description": "حقوق فکری مشخص با محدوده جغرافیایی، مدت و قابلیت واگذاری.",
    "icon": "Lightbulb",
    "fields": [
      {
        "key": "right_type",
        "label": "نوع حق فکری",
        "type": "text",
        "required": true,
        "maxLength": 200
      },
      {
        "key": "right_identifier",
        "label": "شناسه ثبت یا شواهد ایجاد حق",
        "type": "text",
        "required": true,
        "maxLength": 250
      },
      {
        "key": "territory",
        "label": "قلمرو جغرافیایی حقوق",
        "type": "text",
        "required": true,
        "maxLength": 300
      },
      {
        "key": "rights_scope",
        "label": "محدوده حقوق و استثناها",
        "type": "textarea",
        "required": true,
        "maxLength": 2500
      },
      {
        "key": "license_obligations",
        "label": "مجوزهای قبلی و تعهدات",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "ip_evidence",
        "label": "مدارک ایجاد یا ثبت حق",
        "description": "گواهی ثبت یا شواهد قابل بررسی ایجاد حق.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "rights_chain",
        "label": "زنجیره انتقال حقوق",
        "description": "قراردادهای انتقال یا مجوز مربوط به مالک فعلی.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "license_contracts",
        "label": "قراردادهای بهره‌برداری",
        "description": "مجوزها و قراردادهای درآمدی موجود.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "patent",
    "category": "intangible",
    "title": "اختراع و پتنت",
    "description": "حقوق اختراع ثبت‌شده یا درخواست مشخص با وضعیت روشن.",
    "icon": "FlaskConical",
    "fields": [
      {
        "key": "patent_number",
        "label": "شماره ثبت یا درخواست",
        "type": "text",
        "required": true,
        "maxLength": 160
      },
      {
        "key": "patent_jurisdiction",
        "label": "مرجع و قلمرو ثبت",
        "type": "text",
        "required": true,
        "maxLength": 300
      },
      {
        "key": "filing_date",
        "label": "تاریخ میلادی ثبت درخواست",
        "type": "date",
        "required": true
      },
      {
        "key": "patent_status",
        "label": "وضعیت پرونده",
        "type": "select",
        "required": true,
        "options": [
          {
            "value": "pending",
            "label": "در حال بررسی"
          },
          {
            "value": "granted",
            "label": "ثبت‌شده"
          },
          {
            "value": "expired",
            "label": "منقضی"
          },
          {
            "value": "other",
            "label": "سایر"
          }
        ]
      },
      {
        "key": "claims_scope",
        "label": "محدوده ادعاها و حقوق قابل واگذاری",
        "type": "textarea",
        "required": true,
        "maxLength": 2500
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "patent_record",
        "label": "پرونده ثبت یا درخواست",
        "description": "گواهی یا رسید درخواست و وضعیت پرونده.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "claims_documents",
        "label": "متن ادعاها و مشخصات",
        "description": "اسناد مرتبط ادعاها و شرح اختراع.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "assignments",
        "label": "قرارداد انتقال یا مجوز",
        "description": "اسناد زنجیره حق و محدودیت‌های مجوز.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "brand",
    "category": "intangible",
    "title": "برند و علامت تجاری",
    "description": "حقوق علامت، قلمرو و طبقات ثبت یا بهره‌برداری تجاری.",
    "icon": "BadgeCheck",
    "fields": [
      {
        "key": "brand_name",
        "label": "نام علامت یا برند",
        "type": "text",
        "required": true,
        "maxLength": 160
      },
      {
        "key": "registration_details",
        "label": "شماره، مرجع و وضعیت ثبت",
        "type": "textarea",
        "required": true,
        "maxLength": 1600
      },
      {
        "key": "registered_classes",
        "label": "طبقات و قلمرو حقوق",
        "type": "text",
        "required": true,
        "maxLength": 600
      },
      {
        "key": "license_obligations",
        "label": "قراردادهای مجوز و محدودیت‌ها",
        "type": "textarea",
        "required": true,
        "maxLength": 2200
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "trademark_record",
        "label": "مدارک علامت تجاری",
        "description": "گواهی ثبت، تمدید یا درخواست و وضعیت فعلی.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "brand_usage",
        "label": "شواهد استفاده و فعالیت برند",
        "description": "نمونه استفاده و اطلاعات فعالیت مرتبط.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "license_contracts",
        "label": "قراردادهای مجوز",
        "description": "قراردادهای فرانچایز یا بهره‌برداری موجود.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "software",
    "category": "intangible",
    "title": "نرم‌افزار و فناوری",
    "description": "حقوق نرم‌افزار، محصول دیجیتال یا فناوری با محدودیت‌های مجوز روشن.",
    "icon": "CodeXml",
    "fields": [
      {
        "key": "product_name",
        "label": "نام محصول یا فناوری",
        "type": "text",
        "required": true,
        "maxLength": 160
      },
      {
        "key": "software_rights",
        "label": "حقوق قابل واگذاری",
        "type": "textarea",
        "required": true,
        "maxLength": 2200
      },
      {
        "key": "license_dependencies",
        "label": "مجوزها و وابستگی‌های ثالث",
        "type": "textarea",
        "required": true,
        "maxLength": 2200
      },
      {
        "key": "development_stage",
        "label": "وضعیت توسعه و بهره‌برداری",
        "type": "text",
        "required": true,
        "maxLength": 300
      },
      {
        "key": "revenue_model",
        "label": "مدل درآمد و قراردادها",
        "type": "textarea",
        "required": true,
        "maxLength": 2200
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "software_ownership",
        "label": "مدارک مالکیت نرم‌افزار",
        "description": "قرارداد توسعه، انتقال حقوق یا مدارک ثبت.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "technical_description",
        "label": "معرفی فنی بدون اطلاعات محرمانه",
        "description": "شرح معماری و قابلیت‌ها؛ کلید، رمز یا سورس محرمانه بارگذاری نکنید.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "licenses",
        "label": "مجوزهای مرتبط",
        "description": "فهرست مجوزها و قراردادهای ثالث مرتبط.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "revenue_contracts",
        "label": "قراردادهای درآمدی",
        "description": "نمونه قراردادها و گزارش درآمد موجود.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  },
  {
    "id": "royalties",
    "category": "intangible",
    "title": "حق نشر و جریان درآمد",
    "description": "حقوق درآمد ناشی از اثر یا قرارداد با مدت و سهم روشن.",
    "icon": "Music2",
    "fields": [
      {
        "key": "underlying_work",
        "label": "اثر یا قرارداد پایه",
        "type": "text",
        "required": true,
        "maxLength": 250
      },
      {
        "key": "revenue_source",
        "label": "منبع و نحوه دریافت درآمد",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      },
      {
        "key": "revenue_share_percent",
        "label": "سهم حقوق مورد درخواست",
        "type": "number",
        "required": true,
        "unit": "درصد",
        "min": "0",
        "exclusiveMin": true,
        "maxIntegerDigits": 3,
        "maxFractionDigits": 2,
        "max": "100"
      },
      {
        "key": "contract_term",
        "label": "مدت و شرایط خاتمه قرارداد",
        "type": "textarea",
        "required": true,
        "maxLength": 1800
      },
      {
        "key": "existing_obligations",
        "label": "واگذاری‌های قبلی و تعهدات",
        "type": "textarea",
        "required": true,
        "maxLength": 2000
      }
    ],
    "documents": [
      {
        "key": "ownership_evidence",
        "label": "مدرک مالکیت یا حق بهره‌برداری",
        "description": "سند یا قرارداد مرتبط با حق قابل توکنایز کردن؛ بارگذاری به معنی تأیید اعتبار آن نیست.",
        "required": true,
        "group": "مالکیت"
      },
      {
        "key": "owner_identity",
        "label": "مدارک هویت مالک یا نماینده",
        "description": "مدرک هویتی مرتبط با مالک یا نماینده مجاز؛ اطلاعات غیرضروری را پوشانده نگه دارید.",
        "required": true,
        "group": "هویت و اختیار"
      },
      {
        "key": "valuation_report",
        "label": "گزارش ارزش‌گذاری موجود",
        "description": "گزارش کارشناسی یا روش برآورد ارزش، در صورت وجود؛ بررسی مالی جداگانه انجام می‌شود.",
        "required": false,
        "group": "مالی"
      },
      {
        "key": "representation_authority",
        "label": "مدرک نمایندگی یا اختیار امضا",
        "description": "برای نماینده یا شخص حقوقی، معرفی‌نامه و مدرک اختیار اقدام را ارائه کنید.",
        "required": false,
        "group": "هویت و اختیار"
      },
      {
        "key": "royalty_contract",
        "label": "قرارداد حق درآمد",
        "description": "قرارداد تعیین سهم، مدت و طرف‌های حق درآمد.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "rights_chain",
        "label": "اسناد زنجیره حقوق",
        "description": "مدارک اتصال حق درآمد به مالک یا نماینده فعلی.",
        "required": true,
        "group": "مدارک تخصصی"
      },
      {
        "key": "revenue_history",
        "label": "سوابق درآمد موجود",
        "description": "گزارش درآمد و پرداخت‌های قابل استناد.",
        "required": false,
        "group": "مدارک تخصصی"
      }
    ]
  }
];

export function getAssetType(id: string): AssetType | undefined { return assetTypes.find((asset) => asset.id === id); }
export function getAssetFields(id: string): AssetField[] {
  const asset = getAssetType(id);
  return asset ? [...commonFields, ...asset.fields] : [];
}
export function isTokenizationStatus(value: unknown): value is TokenizationStatus {
  return typeof value === "string" && Object.hasOwn(statusLabels, value);
}
export function isReviewStatus(value: unknown): value is ReviewStatus {
  return typeof value === "string" && Object.hasOwn(reviewLabels, value);
}

export class TokenizationValidationError extends Error {
  field: string;
  code: string;
  constructor(field: string, message: string, code = "invalid") {
    super(message);
    this.name = "TokenizationValidationError";
    this.field = field;
    this.code = code;
  }
}
function invalid(field: string, message: string, code = "invalid"): never {
  throw new TokenizationValidationError(field, message, code);
}
function record(value: unknown, field: string): Record<string, unknown> {
  if (!value || typeof value !== "object" || Array.isArray(value) ||
    ![Object.prototype, null].includes(Object.getPrototypeOf(value))) {
    invalid(field, "ساختار اطلاعات معتبر نیست.");
  }
  return value as Record<string, unknown>;
}
function whitelist(value: Record<string, unknown>, keys: readonly string[], field: string) {
  for (const key of Object.keys(value)) if (!keys.includes(key)) invalid(field ? field + "." + key : key, "این فیلد برای درخواست پذیرفته نمی‌شود.", "unknown_field");
}
function asciiDigits(value: string): string {
  return value.replace(/[۰-۹]/g, (digit) => String(digit.charCodeAt(0) - 1776))
    .replace(/[٠-٩]/g, (digit) => String(digit.charCodeAt(0) - 1632));
}
export type NumericStringOptions = { integer?: boolean; maxIntegerDigits?: number; maxFractionDigits?: number };
/**
 * Returns an exact, unsigned decimal string or null. No floating-point conversion,
 * exponent notation, rounding, arbitrary punctuation stripping or numeric coercion.
 */
export function normalizeNumericString(input: unknown, options: NumericStringOptions = {}): string | null {
  if (typeof input !== "string" || input.length > 256) return null;
  const maximumInteger = options.maxIntegerDigits ?? 30;
  const maximumFraction = options.maxFractionDigits ?? (options.integer ? 0 : 18);
  if (!Number.isSafeInteger(maximumInteger) || maximumInteger < 1 || maximumInteger > 78 ||
    !Number.isSafeInteger(maximumFraction) || maximumFraction < 0 || maximumFraction > 78) return null;
  const value = asciiDigits(input).trim().replace(/٫/g, ".");
  if (!value || !/^[0-9.,٬ \u00a0\u202f]+$/.test(value)) return null;
  const parts = value.split(".");
  if (parts.length > 2) return null;
  const integer = parts[0];
  const fraction = parts[1] ?? "";
  if (!/^[0-9]*$/.test(fraction) || (!integer && !fraction)) return null;
  const normalizedGroups = integer.replace(/[٬ \u00a0\u202f]/g, ",");
  if (normalizedGroups.includes(",") && !/^[0-9]{1,3}(,[0-9]{3})+$/.test(normalizedGroups)) return null;
  const whole = normalizedGroups.replace(/,/g, "").replace(/^0+(?=\d)/, "") || "0";
  const decimal = fraction.replace(/0+$/, "");
  if (whole.length > maximumInteger || decimal.length > maximumFraction || (options.integer && decimal.length > 0)) return null;
  return whole + (decimal ? "." + decimal : "");
}
function compareDecimal(left: string, right: string): number {
  const [a, af = ""] = left.split(".");
  const [b, bf = ""] = right.split(".");
  const places = Math.max(af.length, bf.length);
  const first = BigInt(a + af.padEnd(places, "0"));
  const second = BigInt(b + bf.padEnd(places, "0"));
  return first < second ? -1 : first > second ? 1 : 0;
}
function textValue(value: unknown, field: string, maximum: number, multiline = false): string {
  if (typeof value !== "string" || value.length > maximum * 4) invalid(field, "متن این فیلد معتبر نیست.");
  const result = value.normalize("NFC").trim();
  // eslint-disable-next-line no-control-regex -- Reject invisible controls in submitted text.
  if (/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f\u202a-\u202e\u2066-\u2069]/.test(result)) {
    invalid(field, "متن شامل نویسه نامعتبر است.");
  }
  const normalized = multiline ? result.replace(/\r\n?/g, "\n") : result.replace(/\s+/g, " ");
  if (normalized.length > maximum) invalid(field, "متن این فیلد طولانی‌تر از حد مجاز است.", "too_long");
  return normalized;
}
function validDate(value: string): boolean {
  if (!/^\d{4}-\d{2}-\d{2}$/.test(value)) return false;
  const [year, month, day] = value.split("-").map(Number);
  const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);
  return year >= 1 && month >= 1 && month <= 12 && day >= 1 &&
    day <= [31, leap ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month - 1];
}
/** Partial permits incomplete drafts; values present still undergo all format/bound checks. */
export function validateAssetFields(typeId: string, input: unknown, options: { partial?: boolean } = {}): Record<string, string> {
  const asset = getAssetType(typeId);
  if (!asset) invalid("asset_type", "نوع دارایی را انتخاب کنید.", "unknown_asset");
  const definitions = getAssetFields(typeId);
  const values = record(input, "fields");
  whitelist(values, definitions.map((field) => field.key), "");
  const result: Record<string, string> = {};
  for (const field of definitions) {
    const value = values[field.key];
    if (value === undefined) {
      if (!options.partial && field.required) invalid(field.key, field.label + " را وارد کنید.", "required");
      continue;
    }
    const normalized = textValue(value, field.key, field.maxLength ?? (field.type === "number" ? 256 : 500), field.type === "textarea");
    if (!normalized) {
      if (!options.partial && field.required) invalid(field.key, field.label + " را وارد کنید.", "required");
      result[field.key] = "";
      continue;
    }
    if (field.type === "number") {
      const numeric = normalizeNumericString(normalized, field);
      if (numeric === null) invalid(field.key, field.label + " را با عدد معتبر و دقت مجاز وارد کنید.", "invalid_number");
      if (field.min !== undefined && (compareDecimal(numeric, field.min) < 0 || (field.exclusiveMin && compareDecimal(numeric, field.min) === 0))) {
        invalid(field.key, field.label + " از حداقل مجاز کمتر است.", "out_of_range");
      }
      if (field.max !== undefined && compareDecimal(numeric, field.max) > 0) invalid(field.key, field.label + " از حداکثر مجاز بیشتر است.", "out_of_range");
      result[field.key] = numeric;
    } else if (field.type === "select") {
      if (!field.options?.some((option) => option.value === normalized)) invalid(field.key, "یکی از گزینه‌های مجاز " + field.label + " را انتخاب کنید.");
      result[field.key] = normalized;
    } else if (field.type === "date") {
      const date = asciiDigits(normalized);
      if (!validDate(date)) invalid(field.key, "تاریخ میلادی معتبر با قالب سال-ماه-روز وارد کنید.", "invalid_date");
      result[field.key] = date;
    } else {
      result[field.key] = normalized;
    }
  }
  return result;
}
function requiredText(input: Record<string, unknown>, key: string, maximum: number, multiline = false): string {
  const value = textValue(input[key], key, maximum, multiline);
  if (!value) invalid(key, "این فیلد را کامل کنید.", "required");
  return value;
}
function boundedInteger(value: unknown, field: string, minimum: number, maximum: number): number {
  if (typeof value !== "number" || !Number.isSafeInteger(value) || value < minimum || value > maximum) invalid(field, "عدد صحیح در محدوده مجاز وارد کنید.", "out_of_range");
  return value;
}
/**
 * Validates proposal data only. This does not authorize its acceptance, issuance,
 * on-chain settlement or balance credit; those require versioned server-side checks.
 */
export function validateTokenomics(input: unknown): Tokenomics {
  const proposal = record(input, "tokenomics");
  whitelist(proposal, ["name", "symbol", "total_supply", "decimals", "unit_price_rial", "network", "chain_id", "rights", "transfer_policy", "redemption_policy", "risk_disclosure", "allocations", "wallet_destination", "recipient_address"], "");
  const name = requiredText(proposal, "name", 100);
  const symbol = requiredText(proposal, "symbol", 12).toUpperCase();
  if (!/^[A-Z][A-Z0-9]{0,11}$/.test(symbol)) invalid("symbol", "نماد باید با حرف لاتین شروع شود و حداکثر ۱۲ حرف یا رقم داشته باشد.");
  const decimals = boundedInteger(proposal.decimals, "decimals", 0, 18);
  // The internal holdings ledger uses numeric(38,18): at most 20 integer digits.
  const totalSupply = normalizeNumericString(proposal.total_supply, { maxIntegerDigits: 20, maxFractionDigits: decimals });
  if (totalSupply === null || totalSupply === "0") invalid("total_supply", "تعداد توکن باید مثبت، کمتر از ۱۰ به توان ۲۰ و با دقت تعیین‌شده باشد.", "invalid_number");
  const [whole, fraction = ""] = totalSupply.split(".");
  if (BigInt(whole + fraction.padEnd(decimals, "0")) > (BigInt(1) << BigInt(256)) - BigInt(1)) invalid("total_supply", "تعداد توکن از ظرفیت صدور بیشتر است.", "out_of_range");
  const price = normalizeNumericString(proposal.unit_price_rial, { integer: true, maxIntegerDigits: 24, maxFractionDigits: 0 });
  if (price === null || price === "0") invalid("unit_price_rial", "قیمت هر توکن باید عدد صحیح و مثبت به ریال باشد.", "invalid_number");
  if (proposal.wallet_destination !== undefined && proposal.wallet_destination !== "internal") invalid("wallet_destination", "مقصد صدور فقط کیف پول داخلی صاحب درخواست است.");
  if (proposal.recipient_address !== undefined && proposal.recipient_address !== "") invalid("recipient_address", "نشانی مقصد از طرف سامانه تعیین می‌شود و در پیشنهاد قابل تغییر نیست.");
  const allocationsInput = proposal.allocations;
  if (!Array.isArray(allocationsInput) || allocationsInput.length < 1 || allocationsInput.length > 20) invalid("allocations", "بین یک تا بیست ردیف تخصیص وارد کنید.");
  const labels = new Set<string>();
  let basisPoints = BigInt(0);
  const allocations = allocationsInput.map((raw, index) => {
    const prefix = "allocations." + index;
    const allocation = record(raw, prefix);
    whitelist(allocation, ["label", "percent", "lock_months"], prefix);
    const label = textValue(allocation.label, prefix + ".label", 100);
    if (!label) invalid(prefix + ".label", "عنوان تخصیص را وارد کنید.", "required");
    if (labels.has(label)) invalid(prefix + ".label", "عنوان تخصیص تکراری است.");
    labels.add(label);
    if (typeof allocation.percent !== "number" || !Number.isFinite(allocation.percent) || allocation.percent <= 0 || allocation.percent > 100) invalid(prefix + ".percent", "درصد تخصیص باید بیشتر از صفر و حداکثر صد باشد.", "out_of_range");
    const percent = normalizeNumericString(String(allocation.percent), { maxIntegerDigits: 3, maxFractionDigits: 2 });
    if (percent === null) invalid(prefix + ".percent", "درصد تخصیص حداکثر دو رقم اعشار دارد.", "invalid_number");
    const [major, minor = ""] = percent.split(".");
    basisPoints += BigInt(major + minor.padEnd(2, "0"));
    return { label, percent: allocation.percent, lock_months: boundedInteger(allocation.lock_months, prefix + ".lock_months", 0, 1200) };
  });
  if (basisPoints !== BigInt(10000)) invalid("allocations", "مجموع درصدهای تخصیص باید دقیقاً ۱۰۰ باشد.", "allocation_total");
  return {
    name, symbol, total_supply: totalSupply, decimals, unit_price_rial: price,
    network: requiredText(proposal, "network", 100),
    chain_id: boundedInteger(proposal.chain_id, "chain_id", 1, Number.MAX_SAFE_INTEGER),
    rights: requiredText(proposal, "rights", 4000, true),
    transfer_policy: requiredText(proposal, "transfer_policy", 3000, true),
    redemption_policy: requiredText(proposal, "redemption_policy", 3000, true),
    risk_disclosure: requiredText(proposal, "risk_disclosure", 4000, true),
    allocations, wallet_destination: "internal",
  };
}
export function canEditTokenization(status: TokenizationStatus): boolean {
  return status === "draft" || status === "changes_requested";
}
export function isEvmAddress(value: unknown): value is string {
  return typeof value === "string" && /^0x[0-9a-fA-F]{40}$/.test(value) && !/^0x0{40}$/.test(value);
}
export function isTransactionHash(value: unknown): value is string {
  return typeof value === "string" && /^0x[0-9a-fA-F]{64}$/.test(value) && !/^0x0{64}$/.test(value);
}
