/* PEWIT Labs — GEO Analysis Tool admin */
(function ($) {
  'use strict';

  var cfg = window.AIVT || {};

  function notice(msg, type) {
    var $n = $('#aivt-notice, .aivt-metabox-status').first();
    if (!$n.length) { return; }
    $n.removeClass('aivt-notice-ok aivt-notice-error aivt-notice-warn')
      .addClass('aivt-notice-' + (type || 'ok'))
      .text(msg);
  }

  function ajax(action, data) {
    data = data || {};
    data.action = action;
    data.nonce = cfg.nonce;
    return $.post(cfg.ajax, data);
  }

  function scoreClass(score) {
    score = parseInt(score, 10) || 0;
    if (score >= 70) { return 'aivt-ok'; }
    if (score >= 50) { return 'aivt-warn'; }
    return 'aivt-bad';
  }

  /* ---------- Settings ---------- */
  $(document).on('click', '#aivt-api-key-change', function () {
    $('#aivt-api-key-saved').hide();
    $('#aivt-api-key-edit').show();
    $('#aivt_api_key').val('').trigger('focus');
  });
  $(document).on('click', '#aivt-api-key-cancel', function () {
    $('#aivt-api-key-edit').hide();
    $('#aivt-api-key-saved').show();
  });

  $(document).on('click', '#aivt-test-api', function () {
    var $btn = $(this).prop('disabled', true);
    ajax('aivt_test_api', {
      provider: $('#aivt_provider').val(),
      api_key: $('#aivt_api_key').val(),
      model: $('#aivt_model').val()
    }).done(function (res) {
      if (res.success) {
        notice(res.data.message, 'ok');
        $('#aivt-api-status').removeClass('error').addClass('ok').text(res.data.message);
        if (res.data.mask) {
          $('#aivt_api_key_mask').text(res.data.mask);
          $('#aivt-api-key-saved').show();
          $('#aivt-api-key-edit').hide();
        }
        cfg.apiReady = 1;
      } else {
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
        $('#aivt-api-status').removeClass('ok').addClass('error').text(res.data && res.data.message);
      }
    }).fail(function () { notice(cfg.i18n.error, 'error'); })
      .always(function () { $btn.prop('disabled', false); });
  });

  $(document).on('click', '#aivt-save-settings', function () {
    var $btn = $(this).prop('disabled', true);
    var postTypes = [];
    $('.aivt-cpt-enabled:checked').each(function () { postTypes.push($(this).val()); });
    ajax('aivt_save_settings', {
      provider: $('#aivt_provider').val(),
      api_key: $('#aivt_api_key').val(),
      model: $('#aivt_model').val(),
      brand_name: $('#aivt_brand_name').val(),
      brand_aliases: $('#aivt_brand_aliases').val(),
      business_type: $('#aivt_business_type').val(),
      location: $('#aivt_location').val(),
      target_keywords: $('#aivt_target_keywords').val(),
      competitors: $('#aivt_competitors').val(),
      global_context: $('#aivt_global_context').val(),
      enabled_post_types: postTypes,
      auto_analyze: $('#aivt_auto_analyze').is(':checked') ? 1 : 0,
      batch_size: $('#aivt_batch_size').val(),
      batch_delay: $('#aivt_batch_delay').val(),
      prompt_schedule: $('#aivt_prompt_schedule').val(),
      notify_email_enabled: $('#aivt_notify_email_enabled').is(':checked') ? 1 : 0,
      notify_email_to: $('#aivt_notify_email_to').val(),
      whitelabel_enabled: $('#aivt_whitelabel_enabled').is(':checked') ? 1 : 0,
      whitelabel_brand: $('#aivt_whitelabel_brand').val()
    }).done(function (res) {
      notice((res.data && res.data.message) || cfg.i18n.saved, res.success ? 'ok' : 'error');
    }).always(function () { $btn.prop('disabled', false); });
  });

  /* ---------- Content list: row analyze ---------- */
  $(document).on('click', '.aivt-row-analyze', function () {
    var $btn = $(this).prop('disabled', true);
    var pid = $btn.data('post-id');
    notice(cfg.i18n.analyzing, 'warn');
    ajax('aivt_analyze', { post_id: pid, kind: 'geo' }).done(function (res) {
      if (res.success) {
        notice(cfg.i18n.done, 'ok');
        var $cell = $btn.closest('tr').find('.aivt-score-cell');
        $cell.html('<span class="aivt-score-pill ' + scoreClass(res.score) + '">' + res.score + '</span>');
      } else {
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
      }
    }).fail(function () { notice(cfg.i18n.error, 'error'); })
      .always(function () { $btn.prop('disabled', false); });
  });

  /* ---------- Prompt testing ---------- */
  $(document).on('click', '#aivt-run-prompt', function () {
    var prompt = $('#aivt-prompt-input').val();
    if (!prompt) { return; }
    var $btn = $(this).prop('disabled', true);
    $('#aivt-prompt-result').html('<p class="description">' + cfg.i18n.analyzing + '</p>');
    ajax('aivt_run_prompt', { prompt: prompt }).done(function (res) {
      if (res.success) {
        $('#aivt-prompt-result').html(res.data.html);
      } else {
        $('#aivt-prompt-result').empty();
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
      }
    }).fail(function () { notice(cfg.i18n.error, 'error'); })
      .always(function () { $btn.prop('disabled', false); });
  });

  $(document).on('click', '#aivt-suggest-prompts', function () {
    var $btn = $(this).prop('disabled', true);
    ajax('aivt_suggest_prompts', {}).done(function (res) {
      if (res.success && res.data.prompts) {
        var html = '';
        res.data.prompts.forEach(function (p) {
          html += '<button type="button" class="button button-small aivt-suggestion">' + $('<div>').text(p).html() + '</button>';
        });
        $('#aivt-prompt-suggestions').html(html);
      } else {
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
      }
    }).always(function () { $btn.prop('disabled', false); });
  });

  $(document).on('click', '.aivt-suggestion', function () {
    $('#aivt-prompt-input').val($(this).text());
    $('#aivt-run-prompt').trigger('click');
  });

  $(document).on('click', '#aivt-save-prompts', function () {
    var $btn = $(this).prop('disabled', true);
    ajax('aivt_save_prompts', { prompts: $('#aivt-monitored').val() }).done(function (res) {
      notice((res.data && res.data.message) || cfg.i18n.saved, res.success ? 'ok' : 'error');
    }).always(function () { $btn.prop('disabled', false); });
  });

  /* ---------- Competitors ---------- */
  $(document).on('click', '#aivt-run-competitors', function () {
    var $btn = $(this).prop('disabled', true);
    $('#aivt-competitor-report').html('<p class="description">' + cfg.i18n.analyzing + '</p>');
    ajax('aivt_run_competitors', {}).done(function (res) {
      if (res.success) {
        $('#aivt-competitor-report').html(res.data.html);
      } else {
        $('#aivt-competitor-report').empty();
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
      }
    }).always(function () { $btn.prop('disabled', false); });
  });

  /* ---------- Jobs ---------- */
  var jobPoll;
  function refreshJob() {
    ajax('aivt_job_status', {}).done(function (res) {
      if (res.success && res.data.html) {
        $('#aivt-job-panel').html(res.data.html);
        var status = res.data.job && res.data.job.status;
        if (status === 'running') {
          if (!jobPoll) { jobPoll = setInterval(refreshJob, 4000); }
        } else if (jobPoll) { clearInterval(jobPoll); jobPoll = null; }
      }
    });
  }
  $(document).on('click', '#aivt-start-bulk', function () {
    var $btn = $(this).prop('disabled', true);
    var jobType = $('#aivt-job-type').val() || 'geo';
    ajax('aivt_start_bulk', { job_type: jobType }).done(function (res) {
      if (res.success) {
        notice(res.data.message, 'ok');
        if (res.data.html) { $('#aivt-job-panel').html(res.data.html); }
        refreshJob();
      } else {
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
        $btn.prop('disabled', false);
      }
    });
  });
  $(document).on('click', '.aivt-job-control', function () {
    ajax('aivt_job_control', { job_action: $(this).data('action') }).done(function (res) {
      if (res.success && res.data.html) { $('#aivt-job-panel').html(res.data.html); refreshJob(); }
    });
  });
  $(function () {
    if ($('#aivt-job-panel').find('.aivt-progress-bar').length) { refreshJob(); }
  });

  /* ---------- Suggestions (approval queue) ---------- */
  $(document).on('click', '.aivt-approval-approve', function () {
    var $card = $(this).closest('.aivt-approval');
    var $btn = $(this).prop('disabled', true);
    ajax('aivt_approve_suggestion', { id: $card.data('id') }).done(function (res) {
      if (res.success) {
        notice((res.data && res.data.message) || cfg.i18n.inserted, 'ok');
        $card.slideUp(150, function () { $card.remove(); });
      } else {
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
        $btn.prop('disabled', false);
      }
    }).fail(function () { notice(cfg.i18n.error, 'error'); $btn.prop('disabled', false); });
  });
  $(document).on('click', '.aivt-approval-dismiss', function () {
    var $card = $(this).closest('.aivt-approval');
    var $btn = $(this).prop('disabled', true);
    ajax('aivt_dismiss_suggestion', { id: $card.data('id') }).done(function (res) {
      if (res.success) {
        $card.slideUp(150, function () { $card.remove(); });
      } else {
        $btn.prop('disabled', false);
      }
    }).fail(function () { $btn.prop('disabled', false); });
  });

  /* ---------- Metabox ---------- */
  function metaPostId() {
    var $box = $('.aivt-metabox');
    return $box.data('post-id') || $('#post_ID').val();
  }

  $(document).on('click', '.aivt-mb-tab', function () {
    var tab = $(this).data('tab');
    $('.aivt-mb-tab').removeClass('is-active');
    $(this).addClass('is-active');
    $('.aivt-mb-panel').attr('hidden', true);
    $('.aivt-mb-panel[data-panel="' + tab + '"]').removeAttr('hidden');
  });

  $(document).on('click', '.aivt-analyze-btn', function () {
    var $btn = $(this).prop('disabled', true);
    var kind = $btn.data('kind');
    var $panel = $btn.closest('.aivt-mb-panel').find('.aivt-panel-result');
    $panel.html('<p class="description">' + cfg.i18n.analyzing + '</p>');
    ajax('aivt_analyze', { post_id: metaPostId(), kind: kind }).done(function (res) {
      if (res.success) {
        $panel.html(res.data.html);
        notice(cfg.i18n.done, 'ok');
      } else {
        $panel.empty();
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
      }
    }).fail(function () { notice(cfg.i18n.error, 'error'); })
      .always(function () { $btn.prop('disabled', false); });
  });

  var generatedBlocks = {};
  $(document).on('click', '.aivt-generate-btn', function () {
    var $btn = $(this).prop('disabled', true);
    var kind = $btn.data('kind');
    var $wrap = $btn.closest('.aivt-mb-panel');
    var $panel = $wrap.find('.aivt-panel-result');
    var count = 5;
    if ($panel.length) { $panel.html('<p class="description">' + cfg.i18n.analyzing + '</p>'); }
    ajax('aivt_generate', { post_id: metaPostId(), kind: kind, count: count }).done(function (res) {
      if (res.success) {
        if (kind === 'schema') {
          $wrap.find('.aivt-schema-json').val(res.data.json);
        } else {
          $panel.html(res.data.html);
          generatedBlocks[kind] = res.data.blocks;
          $wrap.find('.aivt-insert-btn[data-kind="' + kind + '"]').removeAttr('hidden');
        }
        notice(cfg.i18n.done, 'ok');
      } else {
        if ($panel.length) { $panel.empty(); }
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
      }
    }).fail(function () { notice(cfg.i18n.error, 'error'); })
      .always(function () { $btn.prop('disabled', false); });
  });

  /* ---------- GEO Autopilot ---------- */
  $(document).on('click', '.aivt-autopilot-run', function () {
    var $btn = $(this).prop('disabled', true);
    var $wrap = $btn.closest('.aivt-mb-panel');
    var $res = $wrap.find('.aivt-autopilot-result');
    $res.html('<p class="description">' + (cfg.i18n.analyzing || '…') + '</p>');
    $wrap.find('.aivt-autopilot-apply').attr('hidden', true);
    ajax('aivt_autopilot_preview', { post_id: metaPostId() }).done(function (res) {
      if (res.success) {
        $res.html(res.data.html);
        $wrap.find('.aivt-autopilot-apply').removeAttr('hidden');
        notice(cfg.i18n.done, 'ok');
      } else {
        $res.empty();
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
      }
    }).fail(function () { $res.empty(); notice(cfg.i18n.error, 'error'); })
      .always(function () { $btn.prop('disabled', false); });
  });

  $(document).on('click', '.aivt-autopilot-apply', function () {
    var $btn = $(this).prop('disabled', true);
    var $wrap = $btn.closest('.aivt-mb-panel');
    ajax('aivt_autopilot_apply', { post_id: metaPostId() }).done(function (res) {
      if (res.success) {
        notice((res.data && res.data.message) || cfg.i18n.done, 'ok');
        $btn.attr('hidden', true);
        $wrap.find('.aivt-autopilot-revert').removeAttr('hidden');
      } else {
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
        $btn.prop('disabled', false);
      }
    }).fail(function () { notice(cfg.i18n.error, 'error'); $btn.prop('disabled', false); });
  });

  $(document).on('click', '.aivt-autopilot-revert', function () {
    var $btn = $(this).prop('disabled', true);
    var $wrap = $btn.closest('.aivt-mb-panel');
    ajax('aivt_autopilot_revert', { post_id: metaPostId() }).done(function (res) {
      if (res.success) {
        notice((res.data && res.data.message) || cfg.i18n.done, 'ok');
        $btn.attr('hidden', true);
        $wrap.find('.aivt-autopilot-result').empty();
      } else {
        notice((res.data && res.data.message) || cfg.i18n.error, 'error');
        $btn.prop('disabled', false);
      }
    }).fail(function () { notice(cfg.i18n.error, 'error'); $btn.prop('disabled', false); });
  });

  $(document).on('click', '.aivt-insert-btn', function () {
    var $btn = $(this).prop('disabled', true);
    var kind = $btn.data('kind');
    ajax('aivt_insert_content', { post_id: metaPostId(), blocks: generatedBlocks[kind] || '' }).done(function (res) {
      notice((res.data && res.data.message) || cfg.i18n.inserted, res.success ? 'ok' : 'error');
    }).always(function () { $btn.prop('disabled', false); });
  });

  /* ---------- Onboarding wizard ---------- */
  $(document).on('click', '#aivt-onboarding-finish', function () {
    var $btn = $(this).prop('disabled', true);
    notice(cfg.i18n.saving || '…', 'warn');
    var payload = {
      provider: $('#aivt_provider').val(),
      api_key: $('#aivt_api_key').val(),
      model: $('#aivt_model').val(),
      brand_name: $('#aivt_brand_name').val(),
      business_type: $('#aivt_business_type').val(),
      location: $('#aivt_location').val()
    };
    ajax('aivt_save_settings', payload).done(function () {
      ajax('aivt_test_api', {
        provider: payload.provider, api_key: payload.api_key, model: payload.model
      }).always(function (res) {
        if (res && res.success) {
          notice((res.data && res.data.message) || cfg.i18n.done, 'ok');
        }
        ajax('aivt_finish_onboarding', {}).done(function (fin) {
          window.location.href = (fin && fin.data && fin.data.redirect) ? fin.data.redirect : (cfg.dashboard || '');
        });
      });
    }).fail(function () {
      notice(cfg.i18n.error, 'error');
      $btn.prop('disabled', false);
    });
  });
})(jQuery);
