# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
# incrementally modify your database, and then regenerate this schema definition.
#
# This file is the source Rails uses to define your schema when running `bin/rails
# db:schema:load`. When creating a new database, `bin/rails db:schema:load` tends to
# be faster and is potentially less error prone than running all of your
# migrations from scratch. Old migrations may fail to apply correctly if those
# migrations use external dependencies or application code.
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.0].define(version: 2026_08_10_071637) do
  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"
  enable_extension "vector"

  create_table "analysis_reports", force: :cascade do |t|
    t.bigint "respondent_category_id", null: false
    t.boolean "requires_section_regeneration", default: false
    t.boolean "requires_insight_regeneration", default: false
    t.integer "respondent_ids", default: [], array: true
    t.integer "section_ids", default: [], array: true
    t.integer "question_ids", default: [], array: true
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "language"
    t.integer "tag_ids", default: [], array: true
    t.index ["respondent_category_id"], name: "index_analysis_reports_on_respondent_category_id"
  end

  create_table "asr_models", force: :cascade do |t|
    t.string "name"
    t.string "value"
    t.boolean "supports_translate"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "asr_models_languages", id: false, force: :cascade do |t|
    t.bigint "asr_model_id", null: false
    t.bigint "language_id", null: false
  end

  create_table "assistant_conversations", force: :cascade do |t|
    t.bigint "user_id", null: false
    t.integer "raggable_id"
    t.string "raggable_type"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "language", default: "en"
    t.boolean "outdated", default: false
    t.index ["raggable_id", "raggable_type"], name: "index_assistant_conversations_on_raggable"
    t.index ["user_id"], name: "index_assistant_conversations_on_user_id"
  end

  create_table "assistant_messages", force: :cascade do |t|
    t.string "role"
    t.text "message"
    t.jsonb "sources", default: {}
    t.integer "position"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "assistant_conversation_id"
    t.jsonb "metadata", default: {}
    t.index ["position"], name: "index_assistant_messages_on_position"
    t.index ["role"], name: "index_assistant_messages_on_role"
  end

  create_table "chats", force: :cascade do |t|
    t.string "model_id"
    t.bigint "user_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["user_id"], name: "index_chats_on_user_id"
  end

  create_table "chunks", force: :cascade do |t|
    t.string "chunkable_type", null: false
    t.bigint "chunkable_id", null: false
    t.text "content"
    t.vector "embedding", limit: 3072
    t.integer "chunk_index", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["chunkable_type", "chunkable_id"], name: "index_chunks_on_chunkable"
  end

  create_table "docx_transcripts", force: :cascade do |t|
    t.integer "respondent_id"
    t.jsonb "verbose_json"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.jsonb "translated_verbose_json"
    t.boolean "translated", default: false
    t.index ["respondent_id"], name: "index_docx_transcripts_on_respondent_id"
  end

  create_table "feature_model_maps", force: :cascade do |t|
    t.string "feature_name"
    t.string "llm_model_name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "provider"
  end

  create_table "flipper_features", force: :cascade do |t|
    t.string "key", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["key"], name: "index_flipper_features_on_key", unique: true
  end

  create_table "flipper_gates", force: :cascade do |t|
    t.string "feature_key", null: false
    t.string "key", null: false
    t.text "value"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["feature_key", "key", "value"], name: "index_flipper_gates_on_feature_key_and_key_and_value", unique: true
  end

  create_table "highlight_themes", force: :cascade do |t|
    t.string "theme", null: false
    t.integer "position"
    t.bigint "respondent_category_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["position"], name: "index_highlight_themes_on_position"
    t.index ["respondent_category_id"], name: "index_highlight_themes_on_respondent_category_id"
  end

  create_table "insight_responses", force: :cascade do |t|
    t.jsonb "json"
    t.integer "respondent_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "whisper_version", default: 0
    t.boolean "from_whisper", default: false
    t.integer "insights_report_id"
    t.index ["insights_report_id"], name: "index_insight_responses_on_insights_report_id"
  end

  create_table "insight_summaries", force: :cascade do |t|
    t.integer "interview_question_id"
    t.text "summary"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "insights_report_id"
    t.string "groupable_type"
    t.bigint "groupable_id"
    t.boolean "all_data", default: false
    t.integer "master_section_id"
    t.index ["groupable_type", "groupable_id"], name: "index_insight_summaries_on_groupable"
    t.index ["insights_report_id"], name: "index_insight_summaries_on_insights_report_id"
    t.index ["master_section_id"], name: "index_insight_summaries_on_master_section_id"
  end

  create_table "insights_reports", force: :cascade do |t|
    t.bigint "respondent_category_id", null: false
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "respondent_ids", default: [], array: true
    t.integer "tag_ids", default: [], array: true
    t.integer "question_ids", default: [], array: true
    t.boolean "questions_updated", default: false
    t.string "generation_id"
    t.string "llm_model", default: "gpt-4o-mini"
    t.string "language"
    t.bigint "analysis_report_id"
    t.index ["analysis_report_id"], name: "index_insights_reports_on_analysis_report_id"
    t.index ["respondent_category_id"], name: "index_insights_reports_on_respondent_category_id"
  end

  create_table "instructions", force: :cascade do |t|
    t.text "system_prompt"
    t.text "prompt"
    t.float "temperature"
    t.string "key"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "interview_insights", force: :cascade do |t|
    t.integer "interview_question_id"
    t.integer "respondent_id"
    t.text "insight"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.text "sources"
    t.boolean "from_whisper", default: false
    t.integer "whisper_version", default: 0
    t.integer "score"
    t.integer "insights_report_id"
    t.text "ai_summary"
    t.integer "master_section_id"
    t.index ["insights_report_id"], name: "index_interview_insights_on_insights_report_id"
    t.index ["master_section_id"], name: "index_interview_insights_on_master_section_id"
  end

  create_table "interview_questions", force: :cascade do |t|
    t.integer "respondent_category_id"
    t.text "question"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "master_section_id"
    t.boolean "assignable", default: false
    t.integer "position"
    t.index ["master_section_id"], name: "index_interview_questions_on_master_section_id"
    t.index ["position"], name: "index_interview_questions_on_position"
  end

  create_table "languages", force: :cascade do |t|
    t.string "code"
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "manual_summaries", force: :cascade do |t|
    t.string "title"
    t.bigint "respondent_category_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "document_file_name"
    t.string "document_content_type"
    t.bigint "document_file_size"
    t.datetime "document_updated_at"
    t.index ["respondent_category_id"], name: "index_manual_summaries_on_respondent_category_id"
  end

  create_table "master_sections", force: :cascade do |t|
    t.string "name"
    t.integer "project_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "respondent_category_id"
    t.integer "position"
    t.index ["position"], name: "index_master_sections_on_position"
    t.index ["respondent_category_id"], name: "index_master_sections_on_respondent_category_id"
  end

  create_table "messages", force: :cascade do |t|
    t.bigint "chat_id", null: false
    t.string "role"
    t.text "content"
    t.string "model_id"
    t.integer "input_tokens"
    t.integer "output_tokens"
    t.integer "tool_call_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "cached_tokens"
    t.integer "cache_creation_tokens"
    t.json "content_raw"
    t.text "thinking_text"
    t.text "thinking_signature"
    t.integer "thinking_tokens"
    t.index ["chat_id"], name: "index_messages_on_chat_id"
  end

  create_table "organizations", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "projects", force: :cascade do |t|
    t.string "title"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "organization_id"
    t.string "image_file_name"
    t.string "image_content_type"
    t.bigint "image_file_size"
    t.datetime "image_updated_at"
    t.string "client"
    t.string "brand"
    t.string "category"
    t.string "project_type"
    t.text "description"
    t.string "index_name"
    t.index ["organization_id"], name: "index_projects_on_organization_id"
  end

  create_table "quantifiable_questions", force: :cascade do |t|
    t.string "question"
    t.integer "respondent_category_id"
    t.jsonb "answer"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "question_sections", force: :cascade do |t|
    t.bigint "interview_question_id", null: false
    t.bigint "master_section_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["interview_question_id", "master_section_id"], name: "idx_qs_on_question_and_section", unique: true
    t.index ["interview_question_id"], name: "index_question_sections_on_interview_question_id"
    t.index ["master_section_id"], name: "index_question_sections_on_master_section_id"
  end

  create_table "reels", force: :cascade do |t|
    t.string "title"
    t.jsonb "data", default: []
    t.bigint "respondent_category_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "video_file_name"
    t.string "video_content_type"
    t.bigint "video_file_size"
    t.datetime "video_updated_at"
    t.integer "highlight_ids", default: [], array: true
    t.string "audio_file_name"
    t.string "audio_content_type"
    t.bigint "audio_file_size"
    t.datetime "audio_updated_at"
    t.string "reel_type"
    t.index ["respondent_category_id"], name: "index_reels_on_respondent_category_id"
  end

  create_table "research_documents", force: :cascade do |t|
    t.bigint "respondent_category_id", null: false
    t.string "document_file_name"
    t.string "document_content_type"
    t.integer "document_file_size"
    t.datetime "document_updated_at"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["respondent_category_id"], name: "index_research_documents_on_respondent_category_id"
  end

  create_table "respondent_categories", force: :cascade do |t|
    t.string "name"
    t.integer "project_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "index_name"
    t.text "transcript_summary_prompt", default: "Organise the summary by the different themes that emerged in the discussions."
    t.boolean "requires_section_regeneration", default: false
    t.boolean "requires_insight_regeneration", default: false
    t.boolean "all_data_section_report_generated", default: false
    t.boolean "all_data_insight_report_generated", default: false
  end

  create_table "respondent_tags", force: :cascade do |t|
    t.integer "respondent_id"
    t.integer "tag_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["respondent_id", "tag_id"], name: "index_respondent_tags_on_respondent_id_and_tag_id"
    t.index ["respondent_id"], name: "index_respondent_tags_on_respondent_id"
    t.index ["tag_id"], name: "index_respondent_tags_on_tag_id"
  end

  create_table "respondents", force: :cascade do |t|
    t.string "first_name"
    t.string "last_name"
    t.integer "respondent_category_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "transcript_file_name"
    t.string "transcript_content_type"
    t.bigint "transcript_file_size"
    t.datetime "transcript_updated_at"
    t.string "audio_file_file_name"
    t.string "audio_file_content_type"
    t.bigint "audio_file_file_size"
    t.datetime "audio_file_updated_at"
    t.jsonb "speaker_map", default: {}
    t.string "language"
    t.string "proper_nouns", default: [], array: true
    t.string "asr_model", default: "whisper-large-v3"
    t.string "video_file_file_name"
    t.string "video_file_content_type"
    t.bigint "video_file_file_size"
    t.datetime "video_file_updated_at"
    t.boolean "translate", default: true
    t.jsonb "original_speaker_map", default: {}
    t.string "manual_language"
    t.integer "speaker_count"
    t.text "summary"
    t.vector "embedding", limit: 3072
  end

  create_table "section_summaries", force: :cascade do |t|
    t.integer "master_section_id"
    t.integer "groupable_id"
    t.string "groupable_type"
    t.text "summary"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.boolean "all_data", default: false
    t.index ["groupable_id", "groupable_type"], name: "index_section_summaries_on_groupable_id_and_groupable_type"
    t.index ["master_section_id"], name: "index_section_summaries_on_master_section_id"
  end

  create_table "sections_reports", force: :cascade do |t|
    t.string "name"
    t.integer "tag_ids", default: [], array: true
    t.integer "section_ids", default: [], array: true
    t.integer "respondent_ids", default: [], array: true
    t.integer "transcript_sections_count"
    t.bigint "respondent_category_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "llm_model", default: "gpt-4o-mini"
    t.string "language"
    t.bigint "analysis_report_id"
    t.index ["analysis_report_id"], name: "index_sections_reports_on_analysis_report_id"
    t.index ["respondent_category_id"], name: "index_sections_reports_on_respondent_category_id"
  end

  create_table "stop_words", force: :cascade do |t|
    t.string "word"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "system_tasks", force: :cascade do |t|
    t.integer "user_id"
    t.string "name"
    t.string "task_type"
    t.string "status"
    t.jsonb "metadata"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.boolean "running", default: false
    t.integer "progress", default: 0
    t.string "task_class"
    t.string "request_id"
    t.index ["request_id"], name: "index_system_tasks_on_request_id", unique: true
    t.index ["status"], name: "index_system_tasks_on_status"
    t.index ["task_type", "status"], name: "index_system_tasks_on_task_type_and_status"
    t.index ["task_type"], name: "index_system_tasks_on_task_type"
  end

  create_table "tag_categories", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "project_id"
    t.boolean "multiple_selections", default: false
    t.index ["project_id"], name: "index_tag_categories_on_project_id"
  end

  create_table "tags", force: :cascade do |t|
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "tag_category_id"
    t.index ["tag_category_id"], name: "index_tags_on_tag_category_id"
  end

  create_table "themes_reports", force: :cascade do |t|
    t.string "name"
    t.integer "tag_ids", default: [], array: true
    t.integer "section_ids", default: [], array: true
    t.integer "respondent_ids", default: [], array: true
    t.bigint "respondent_category_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.bigint "analysis_report_id"
    t.index ["analysis_report_id"], name: "index_themes_reports_on_analysis_report_id"
    t.index ["respondent_category_id"], name: "index_themes_reports_on_respondent_category_id"
  end

  create_table "tool_calls", force: :cascade do |t|
    t.bigint "message_id", null: false
    t.string "tool_call_id"
    t.string "name"
    t.jsonb "arguments"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.text "thought_signature"
    t.index ["message_id"], name: "index_tool_calls_on_message_id"
    t.index ["tool_call_id"], name: "index_tool_calls_on_tool_call_id"
  end

  create_table "transcript_highlights", force: :cascade do |t|
    t.float "start"
    t.float "end"
    t.string "highlight_color", null: false
    t.jsonb "content", default: {}
    t.bigint "user_id", null: false
    t.bigint "respondent_id", null: false
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "reel_file_name"
    t.string "reel_content_type"
    t.bigint "reel_file_size"
    t.datetime "reel_updated_at"
    t.bigint "highlight_theme_id"
    t.bigint "master_section_id"
    t.integer "manual_start_line"
    t.integer "manual_end_line"
    t.boolean "manual", default: false, null: false
    t.string "reel_type"
    t.index ["highlight_theme_id"], name: "index_transcript_highlights_on_highlight_theme_id"
    t.index ["master_section_id"], name: "index_transcript_highlights_on_master_section_id"
    t.index ["respondent_id"], name: "index_transcript_highlights_on_respondent_id"
    t.index ["user_id"], name: "index_transcript_highlights_on_user_id"
  end

  create_table "transcript_sections", force: :cascade do |t|
    t.string "name"
    t.text "content"
    t.integer "respondent_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "offset"
    t.integer "master_section_id"
    t.text "ai_summary"
    t.jsonb "metadata", default: {}
    t.index ["offset"], name: "index_transcript_sections_on_offset"
    t.index ["respondent_id"], name: "index_transcript_sections_on_respondent_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "first_name", default: "", null: false
    t.string "last_name", default: "", null: false
    t.string "role", default: "user", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer "sign_in_count", default: 0, null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string "current_sign_in_ip"
    t.string "last_sign_in_ip"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "organization_id"
    t.string "photo_file_name"
    t.string "photo_content_type"
    t.bigint "photo_file_size"
    t.datetime "photo_updated_at"
    t.boolean "active", default: true, null: false
    t.index ["active"], name: "index_users_on_active"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
  end

  create_table "whisper_transcripts", force: :cascade do |t|
    t.integer "respondent_id"
    t.text "text"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.jsonb "verbose_json", default: {}
    t.text "feedback"
    t.integer "rating"
    t.datetime "deleted_at"
    t.boolean "translated", default: false
    t.string "request_id"
    t.index ["deleted_at"], name: "index_whisper_transcripts_on_deleted_at"
  end

  add_foreign_key "analysis_reports", "respondent_categories"
  add_foreign_key "assistant_conversations", "users"
  add_foreign_key "chats", "users"
  add_foreign_key "highlight_themes", "respondent_categories"
  add_foreign_key "insight_summaries", "insights_reports"
  add_foreign_key "insights_reports", "analysis_reports"
  add_foreign_key "insights_reports", "respondent_categories"
  add_foreign_key "manual_summaries", "respondent_categories"
  add_foreign_key "master_sections", "respondent_categories"
  add_foreign_key "messages", "chats"
  add_foreign_key "question_sections", "interview_questions"
  add_foreign_key "question_sections", "master_sections"
  add_foreign_key "reels", "respondent_categories"
  add_foreign_key "research_documents", "respondent_categories"
  add_foreign_key "sections_reports", "analysis_reports"
  add_foreign_key "sections_reports", "respondent_categories"
  add_foreign_key "themes_reports", "analysis_reports"
  add_foreign_key "themes_reports", "respondent_categories"
  add_foreign_key "tool_calls", "messages"
  add_foreign_key "transcript_highlights", "highlight_themes"
  add_foreign_key "transcript_highlights", "master_sections"
  add_foreign_key "transcript_highlights", "respondents"
  add_foreign_key "transcript_highlights", "users"
end
