// Copyright (C) 2020 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

import m from 'mithril';
import {TraceUrlSource} from '../core/trace_source';
import {createPermalink} from './permalink';
import {showModal} from '../widgets/modal';
import {globals} from './globals';
import {AppImpl} from '../core/app_impl';
import {Trace} from '../public/trace';
import {TraceImpl} from '../core/trace_impl';
import {CopyableLink} from '../widgets/copyable_link';

export function isShareable(trace: Trace) {
  return globals.isInternalUser && trace.traceInfo.downloadable;
}

export async function shareTrace(trace: TraceImpl) {
  const traceSource = trace.traceInfo.source;
  const traceUrl = (traceSource as TraceUrlSource).url ?? '';

  // If the trace is not shareable (has been pushed via postMessage()) but has
  // a url, create a pseudo-permalink by echoing back the URL.
  if (!isShareable(trace)) {
    const msg = [
      m(
        'p',
        'This trace was opened by an external site and as such cannot ' +
          'be re-shared preserving the UI state.',
      ),
    ];
    if (traceUrl) {
      msg.push(m('p', 'By using the URL below you can open this trace again.'));
      msg.push(m('p', 'Clicking will copy the URL into the clipboard.'));
      msg.push(m(CopyableLink, {url: traceUrl}));
    }

    showModal({
      title: 'Cannot create permalink from external trace',
      content: m('div', msg),
    });
    return;
  }

  if (!isShareable(trace)) return;

  const result = confirm(
    `Upload UI state and generate a permalink. ` +
      `The trace will be accessible by anybody with the permalink.`,
  );
  if (result) {
    AppImpl.instance.analytics.logEvent('Trace Actions', 'Create permalink');
    return await createPermalink();
  }
}
