public struct <%= model.name %> {

var privateId: Int = 0
<% model.properties.each do |property| %><%= """public var #{property.name}: #{property.type}""" %>
<% end %>
static let tableName = "<%= model.table_name %>"

public enum Column: String, CustomStringConvertible {
    <% model.properties.each do |property| %><%= """case #{property.name} = \"#{property.name.underscore}\"""" %>
    <% end %>
    case privateId = "private_id"

    public var description: String { get { return self.rawValue } }
}

public init(<%= model.property_key_type_pairs %>) {
    <% model.properties.each do |property| %><%= """self.#{property.name} = #{property.name}" %>
    <% end %>
}

@discardableResult static public func new(<%= model.property_key_type_pairs %>) -> <%= model.name %> {
    return <%= model.name %>(<%= model.property_key_value_pairs %>)
}

@discardableResult static public func create(<%= model.property_key_type_pairs %>) -> <%= model.name %>? {
    //if <%= model.properties.select { |p| p.name.downcase.end_with? "id" }.map { |p| "#{p.name} == 0" }.push("false == true").join(" || ") %> { return nil }

    var columnsSQL: [<%= model.name %>.Column] = []
    var valuesSQL: [Unwrapped] = []

    <% model.properties.each do |property| %><% if property.is_optional? %>
    <%= """if let #{property.name} = #{property.name} {
        columnsSQL.append(.#{property.name})
        valuesSQL.append(#{property.name})
    }""" %><% else %>
    <%= """columnsSQL.append(.#{property.name})
    valuesSQL.append(#{property.name})
    """ %><% end %><% end %>
    let insertSQL = "INSERT INTO \(tableName) (\(columnsSQL.map { $0.rawValue }.joined(separator: ", "))) VALUES (\(valuesSQL.map { $0.unwrapped }.joined(separator: ", ")))"
    guard let _ = executeSQL(insertSQL),
      let lastInsertRowId = executeScalarSQL("SELECT last_insert_rowid();") as? Int64 else { return nil }
    var result = <%= model.name %>(<%= model.property_key_value_pairs %>)
    result.privateId = Int(lastInsertRowId)
    return result
}

}