/// 列变更操作模块
///
/// 提供数据库列变更的类型定义和操作
use serde::{Deserialize, Serialize};

/// 列变更类型
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ColumnChangeType {
    /// 重命名列
    RenameColumn,
    /// 修改列类型
    ModifyColumn,
    /// 修改列的可空性
    NullabilityChanged,
    /// 修改列的默认值
    DefaultChanged,
}

/// 列变更操作
///
/// 表示对数据库列的变更操作，包括重命名、修改类型、修改可空性等
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ColumnChange {
    /// 变更类型
    pub change_type: ColumnChangeType,
    /// 表名
    pub table_name: String,
    /// 列名
    pub column_name: String,
    /// 新列名（仅用于重命名操作）
    pub new_column_name: Option<String>,
    /// 新类型（仅用于修改类型操作）
    pub new_type: Option<String>,
    /// 可空性（仅用于修改可空性操作）
    pub nullable: Option<bool>,
    /// 默认值（仅用于修改默认值操作）
    pub default_value: Option<String>,
}

impl ColumnChange {
    /// 创建新的列变更操作
    ///
    /// # 参数
    ///
    /// * `change_type` - 变更类型
    /// * `table_name` - 表名
    /// * `column_name` - 列名
    /// * `value` - 变更值
    pub fn new(change_type: ColumnChangeType, table_name: String, column_name: String, value: String) -> Self {
        Self {
            change_type,
            table_name,
            column_name,
            new_column_name: match change_type {
                ColumnChangeType::RenameColumn => Some(value.clone()),
                _ => None,
            },
            new_type: match change_type {
                ColumnChangeType::ModifyColumn => Some(value.clone()),
                _ => None,
            },
            nullable: None,
            default_value: None,
        }
    }

    /// 设置可空性
    ///
    /// # 参数
    ///
    /// * `nullable` - 是否可空
    pub fn with_nullable(mut self, nullable: bool) -> Self {
        self.nullable = Some(nullable);
        self
    }

    /// 设置默认值
    ///
    /// # 参数
    ///
    /// * `default` - 默认值
    pub fn with_default(mut self, default: String) -> Self {
        self.default_value = Some(default);
        self
    }
}
