///|
/// 记录操作模块
/// 包含记录更新(RecordUpdate)和字段赋值(Mutate)的处理逻辑

///|
/// 处理记录更新表达式 (RecordUpdate)
fn ClosureInterpreter::visit_record_update(
  self : ClosureInterpreter,
  record : @syntax.Expr,
  fields : @list.List[@syntax.FieldDef],
) -> RuntimeValue raise ControlFlow {
  // 先评估原记录
  let original_record = self.visit(record)
  match original_record {
    Object(refer) => {
      // 复制原有字段
      let new_fields = refer.val.copy()

      // 更新指定字段
      fields.each(field => {
        let field_name = field.label.name
        let field_value = self.visit(field.expr)
        new_fields.set(field_name, field_value)
      })

      // 创建新的结构体
      Object({ val: new_fields, ty: refer.ty })
    }
    _ => self.error("RecordUpdate can only be applied to struct values")
  }
}

///|
/// 处理字段赋值 (Mutate)
fn ClosureInterpreter::visit_mutate(
  self : ClosureInterpreter,
  record : @syntax.Expr,
  accessor : @syntax.Accessor,
  field : @syntax.Expr,
  augmented_by : @syntax.Var?,
) -> RuntimeValue raise ControlFlow {

  // 获取记录的运行时值(支持嵌套字段访问)
  match self.visit(record) {
    Object(refer) =>
      match accessor {
        Label(label) =>
          match augmented_by {
            Some(op) => {
              // 增强赋值操作 (+=, -=, 等)
              let op_name = match op.name {
                Ident(name~) => name
                _ => "+"
              }
              let base_op = match op_name {
                "+" => "+"
                "-" => "-"
                "*" => "*"
                "/" => "/"
                "%" => "%"
                _ => "+" // 默认
              }
              let current_val = refer.val
                .get(label.name)
                .unwrap_or(Int(0, raw=None))
              let right_val = self.visit(field)
              let new_val = runtime_value_infix(base_op, current_val, right_val)
              refer.val.set(label.name, new_val)
            }
            None =>
              // 普通赋值操作
              refer.val.set(label.name, self.visit(field))
          }
        Index(tuple_index~, ..) =>
          match augmented_by {
            Some(op) => {
              // 增强赋值操作 (+=, -=, 等)
              let op_name = match op.name {
                Ident(name~) => name
                _ => "+"
              }
              let base_op = match op_name {
                "+" => "+"
                "-" => "-"
                "*" => "*"
                "/" => "/"
                "%" => "%"
                _ => "+" // 默认
              }
              let current_val = refer.val
                .get(tuple_index.to_string())
                .unwrap_or(Int(0, raw=None))
              let right_val = self.visit(field)
              let new_val = runtime_value_infix(base_op, current_val, right_val)
              refer.val.set(tuple_index.to_string(), new_val)
            }
            None =>
              // 普通赋值操作
              refer.val.set(tuple_index.to_string(), self.visit(field))
          }
        Newtype(_) => ()
      }
    Constructor(refer) =>
      match accessor {
        Label({ name, .. }) => {
          // 构造函数字段赋值处理
          let new_field_value = self.visit(field)
          let field = refer.val.fields.search_by(field => {
            field.name == Some(name)
          })
          // 处理构造函数的字段赋值
          if field is Some(i) {
            refer.val.fields[i].value = new_field_value
          }
        }
        _ => () // 其他访问器类型暂不支持
      }
    _ => ()
  }
  Unit
}