local db     = require "lapis.db"
local schema = require "lapis.db.schema"
local types  = schema.types

return {
	[100] = function()
		schema.create_table("users", {
			{ "id",       types.serial  { unique=true, primary_key=true }},
			{ "username", types.varchar { unique=true }},
			{ "password", types.varchar },
			{ "admin",    types.boolean { default=false }},
			{ "mod",      types.boolean { default=false }},
			{ "janitor",  types.boolean { default=false }}
		})

		schema.create_table("bans", {
			{ "id",       types.serial  { unique=true, primary_key=true }},
			{ "board_id", types.integer { default=0 }},
			{ "ip",       types.varchar },
			{ "reason",   types.varchar { null=true }},
			{ "time",     types.integer },
			{ "duration", types.integer { default=259200 }}, -- 3 days
		})

		schema.create_table("boards", {
			{ "id",                types.serial  { unique=true, primary_key=true }},
			{ "short_name",        types.varchar { unique=true }},
			{ "name",              types.varchar { unique=true }},
			{ "subtext",           types.varchar { null=true }},
			{ "rules",             types.text    { null=true }},
			{ "ban_message",       types.varchar { default="USER WAS BANNED FOR THIS POST" }},
			{ "anon_name",         types.varchar { default="Anonymous" }},
			{ "theme",             types.varchar { default="yotsuba_b" }},
			{ "posts",             types.integer { default=0 }},
			{ "pages",             types.integer { default=10 }},
			{ "threads_per_page",  types.integer { default=10 }},
			{ "text_only",         types.boolean { default=false }},
			{ "draw",              types.boolean { default=false }},
			{ "thread_file",       types.boolean { default=true }},
			{ "thread_comment",    types.boolean { default=false }},
			{ "thread_file_limit", types.integer { default=100 }},
			{ "post_file",         types.boolean { default=false }},
			{ "post_comment",      types.boolean { default=false }},
			{ "post_limit",        types.integer { default=250 }},
			{ "archive",           types.boolean { default=true }},
			{ "archive_time",      types.integer { default=2592000 }}, -- 30 days
			{ "group",             types.integer { default=1 }}
		})

		schema.create_table("threads", {
			{ "id",            types.serial  { unique=true, primary_key=true }},
			{ "board_id",      types.integer },
			{ "last_active",   types.integer },
			{ "sticky",        types.boolean { default=false }},
			{ "lock",          types.boolean { default=false }},
			{ "archive",       types.boolean { default=false }},
			{ "size_override", types.boolean { default=false }},
			{ "save",          types.boolean { default=false }}
		})

		schema.create_table("posts", {
			{ "id",           types.serial  { unique=true, primary_key=true }},
			{ "post_id",      types.integer },
			{ "thread_id",    types.integer },
			{ "board_id",     types.integer },
			{ "timestamp",    types.integer },
			{ "ip",           types.varchar },
			{ "comment",      types.text    { null=true }},
			{ "name",         types.varchar { null=true }},
			{ "trip",         types.varchar { null=true }},
			{ "subject",      types.varchar { null=true }},
			{ "password",     types.varchar { null=true }},
			{ "file_name",    types.varchar { null=true }},
			{ "file_path",    types.varchar { null=true }},
			{ "file_md5",     types.varchar { null=true }},
			{ "file_size",    types.integer { null=true }},
			{ "file_width",   types.integer { null=true }},
			{ "file_height",  types.integer { null=true }},
			{ "file_spoiler", types.boolean { null=true }},
			{ "banned",       types.boolean { default=false }}
		})

		schema.create_table("announcements", {
			{ "id",       types.serial  { unique=true, primary_key=true }},
			{ "board_id", types.integer { null=true }},
			{ "text",     types.varchar }
		})

		schema.create_table("reports", {
			{ "id",          types.serial  { unique=true, primary_key=true }},
			{ "board_id",    types.integer },
			{ "thread_id",   types.integer },
			{ "post_id",     types.integer },
			{ "timestamp",   types.integer },
			{ "num_reports", types.integer }
		})

		schema.create_table("pages", {
			{ "id",      types.serial  { unique=true, primary_key=true }},
			{ "url",     types.varchar { unique=true }},
			{ "name",    types.varchar },
			{ "content", types.text }
		})
	end,
	[120] = function()
		schema.add_column("boards", "filetype_image", types.boolean { default=true })
		schema.add_column("boards", "filetype_audio", types.boolean { default=false })
		schema.add_column("posts",  "file_type",      types.varchar { default="image" })
		schema.add_column("posts",  "file_duration",  types.varchar { null=true })
	end,
	[200] = function()

		schema.rename_column("boards", "posts",      "total_posts")
		schema.rename_column("boards", "name",       "title")
		schema.rename_column("boards", "short_name", "name")
		schema.rename_column("pages",  "url",        "slug")
		schema.rename_column("pages",  "name",       "title")
		schema.rename_column("posts",  "post_id",    "post_number")

		db.query("ALTER TABLE posts ALTER COLUMN file_type DROP DEFAULT")
		db.query("ALTER TABLE posts ALTER COLUMN file_type DROP NOT NULL")
		schema.add_column("boards", "anon_only", types.boolean { default=false })

		local Users = require "src.models.users"
		local uuid  = require "resty.jit-uuid"
		uuid.seed()

		schema.add_column("users", "api_key", types.varchar { default="00000000-0000-0000-0000-000000000000" })
		local users = Users:get_all()
		for _, user in ipairs(users) do
			user.api_key = uuid()
			user:update("api_key")
		end

		schema.add_column("users", "role", types.integer)
		db.query("UPDATE users SET role=? WHERE janitor=true", Users.role.JANITOR)
		db.query("UPDATE users SET role=? WHERE mod=true", Users.role.MOD)
		db.query("UPDATE users SET role=? WHERE admin=true", Users.role.ADMIN)
		db.query("UPDATE users SET role=? WHERE id=1", Users.role.OWNER)
		schema.drop_column("users", "janitor")
		schema.drop_column("users", "mod")
		schema.drop_column("users", "admin")

		schema.add_column("posts",  "reports", types.integer)
		db.query("UPDATE posts SET reports=reports.num_reports FROM reports WHERE posts.id=reports.post_id")
		schema.drop_table("reports")
	end
}
