require 'sinatra'
require 'sinatra/json'
require 'json'
require 'securerandom'
require 'fileutils'

set :port, 8000
set :bind, '0.0.0.0'

CONFIGS_DIR = 'configs'
FileUtils.mkdir_p(CONFIGS_DIR)

def load_config(config_id)
  file_path = File.join(CONFIGS_DIR, "#{config_id}.json")
  JSON.parse(File.read(file_path))
rescue Errno::ENOENT
  halt 404, json(error: "Configuration #{config_id} not found")
end

def save_config(config_id, config)
  file_path = File.join(CONFIGS_DIR, "#{config_id}.json")
  File.write(file_path, JSON.pretty_generate(config))
end

post '/config' do
  config_id = SecureRandom.uuid
  initial_config = {
    'version' => '1.0.0',
    'sections' => {
      'main' => [{ 'ai' => {} }]
    }
  }
  save_config(config_id, initial_config)
  json config_id: config_id
end

get '/config/:config_id' do |config_id|
  json load_config(config_id)
end

delete '/config/:config_id' do |config_id|
  file_path = File.join(CONFIGS_DIR, "#{config_id}.json")
  File.delete(file_path)
  json message: "Configuration #{config_id} deleted successfully"
rescue Errno::ENOENT
  halt 404, json(error: "Configuration #{config_id} not found")
end

put '/config/:config_id/params/:param_name' do |config_id, param_name|
  value = JSON.parse(request.body.read)
  config = load_config(config_id)
  config['sections']['main'][0]['ai']['params'] ||= {}
  config['sections']['main'][0]['ai']['params'][param_name] = value
  save_config(config_id, config)
  json message: "Parameter #{param_name} updated successfully"
end

put '/config/:config_id/params' do |config_id|
  params = JSON.parse(request.body.read)
  config = load_config(config_id)
  config['sections']['main'][0]['ai']['params'] ||= {}
  params.each do |param|
    config['sections']['main'][0]['ai']['params'][param['name']] = param['value']
  end
  save_config(config_id, config)
  json message: "#{params.length} parameters updated successfully"
end

delete '/config/:config_id/params/:param_name' do |config_id, param_name|
  config = load_config(config_id)
  if config['sections']['main'][0]['ai']['params'] && config['sections']['main'][0]['ai']['params'].key?(param_name)
    config['sections']['main'][0]['ai']['params'].delete(param_name)
    save_config(config_id, config)
    json message: "Parameter #{param_name} deleted successfully"
  else
    halt 404, json(error: "Parameter #{param_name} not found")
  end
end

put '/config/:config_id/prompt' do |config_id|
  prompt = JSON.parse(request.body.read)
  config = load_config(config_id)
  config['sections']['main'][0]['ai']['prompt'] = prompt
  save_config(config_id, config)
  json message: 'Prompt updated successfully'
end

put '/config/:config_id/post_prompt' do |config_id|
  post_prompt = JSON.parse(request.body.read)
  config = load_config(config_id)
  config['sections']['main'][0]['ai']['post_prompt'] = post_prompt
  save_config(config_id, config)
  json message: 'Post-prompt updated successfully'
end

put '/config/:config_id/languages' do |config_id|
  languages = JSON.parse(request.body.read)
  config = load_config(config_id)
  config['sections']['main'][0]['ai']['languages'] = languages
  save_config(config_id, config)
  json message: 'Languages updated successfully'
end

put '/config/:config_id/hints' do |config_id|
  hints = JSON.parse(request.body.read)
  config = load_config(config_id)
  config['sections']['main'][0]['ai']['hints'] = hints
  save_config(config_id, config)
  json message: 'Hints updated successfully'
end

put '/config/:config_id/swaig/functions/:function_name' do |config_id, function_name|
  function = JSON.parse(request.body.read)
  config = load_config(config_id)
  config['sections']['main'][0]['ai']['SWAIG'] ||= { 'functions' => [] }
  functions = config['sections']['main'][0]['ai']['SWAIG']['functions']
  existing_function = functions.find { |f| f['function'] == function_name }
  if existing_function
    existing_function.merge!(function)
    message = "SWAIG function #{function_name} updated successfully"
  else
    functions << function
    message = "SWAIG function #{function_name} added successfully"
  end
  save_config(config_id, config)
  json message: message
end

delete '/config/:config_id/swaig/functions/:function_name' do |config_id, function_name|
  config = load_config(config_id)
  if config['sections']['main'][0]['ai']['SWAIG'] && config['sections']['main'][0]['ai']['SWAIG']['functions']
    functions = config['sections']['main'][0]['ai']['SWAIG']['functions']
    removed = functions.reject! { |f| f['function'] == function_name }
    if removed
      save_config(config_id, config)
      json message: "SWAIG function #{function_name} deleted successfully"
    else
      halt 404, json(error: "SWAIG function #{function_name} not found")
    end
  else
    halt 404, json(error: "SWAIG function #{function_name} not found")
  end
end

get '/config/:config_id/swaig/functions/:function_name' do |config_id, function_name|
  config = load_config(config_id)
  if config['sections']['main'][0]['ai']['SWAIG'] && config['sections']['main'][0]['ai']['SWAIG']['functions']
    function = config['sections']['main'][0]['ai']['SWAIG']['functions'].find { |f| f['function'] == function_name }
    if function
      json function
    else
      halt 404, json(error: "SWAIG function #{function_name} not found")
    end
  else
    halt 404, json(error: "SWAIG function #{function_name} not found")
  end
end