// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import {AbslStatusCode} from '//resources/mojo/mojo/public/mojom/base/absl_status.mojom-webui.js';

import type {PageHandlerInterface} from './data_sharing.mojom-webui.js';
import {PageCallbackRouter, PageHandlerFactory, PageHandlerRemote} from './data_sharing.mojom-webui.js';
import type {GroupAction, GroupActionProgress} from './data_sharing.mojom-webui.js';
import type {DataSharingSdkSitePreview} from './data_sharing_sdk_types.js';
import {Code} from './data_sharing_sdk_types.js';

export interface BrowserProxy {
  callbackRouter: PageCallbackRouter;
  handler?: PageHandlerInterface;
  showUi(): void;
  closeUi(status: Code): void;
  makeTabGroupShared(tabGroupId: string, groupId: string, tokenSecret: string):
      Promise<string|undefined>;
  aboutToUnShareTabGroup(tabGroupId: string): void;
  onTabGroupUnShareComplete(tabGroupId: string): void;
  getShareLink(groupId: string, tokenSecret: string): Promise<string>;
  getTabGroupPreview(groupId: string, tokenSecret: string):
      Promise<DataSharingSdkSitePreview[]>;
  onGroupAction(action: GroupAction, progress: GroupActionProgress): void;
}

export class BrowserProxyImpl implements BrowserProxy {
  callbackRouter: PageCallbackRouter;
  handler: PageHandlerInterface;

  constructor() {
    this.callbackRouter = new PageCallbackRouter();
    this.handler = new PageHandlerRemote();

    const factory = PageHandlerFactory.getRemote();
    factory.createPageHandler(
        this.callbackRouter.$.bindNewPipeAndPassRemote(),
        (this.handler as PageHandlerRemote).$.bindNewPipeAndPassReceiver());
  }

  showUi() {
    this.handler.showUI();
  }

  closeUi(status: Code) {
    this.handler.closeUI(status);
  }

  aboutToUnShareTabGroup(tabGroupId: string) {
    this.handler.aboutToUnShareTabGroup(tabGroupId);
  }

  onTabGroupUnShareComplete(tabGroupId: string) {
    this.handler.onTabGroupUnShareComplete(tabGroupId);
  }

  makeTabGroupShared(tabGroupId: string, groupId: string, tokenSecret: string):
      Promise<string|undefined> {
    return this.handler.makeTabGroupShared(tabGroupId, groupId, tokenSecret)
        .then(res => res.url ? res.url.url : undefined);
  }

  getShareLink(groupId: string, tokenSecret: string): Promise<string> {
    return this.handler.getShareLink(groupId, tokenSecret)
        .then(res => res.url.url);
  }

  getTabGroupPreview(groupId: string, tokenSecret: string):
      Promise<DataSharingSdkSitePreview[]> {
    return new Promise((resolve) => {
      const previews: DataSharingSdkSitePreview[] = [];
      this.handler.getTabGroupPreview(groupId, tokenSecret).then((res) => {
        if (res.groupPreview.statusCode !== AbslStatusCode.kOk) {
          // TODO(crbug.com/368634445): Ask Chrome to handle different
          // errors in addition to closing the WebUI.
          this.handler.closeUI(Code.UNKNOWN);
        }

        res.groupPreview.sharedTabs.map((sharedTab) => {
          previews.push({
            url: sharedTab.displayUrl,
            faviconUrl:
                this.getFaviconServiceUrl(sharedTab.faviconUrl.url).toString(),
          });
        });
        resolve(previews);
      });
    });
  }

  onGroupAction(action: GroupAction, progress: GroupActionProgress) {
    return this.handler.onGroupAction(action, progress);
  }

  // TODO(crbug.com/392965221): Use function from icon.ts instead.
  private getFaviconServiceUrl(pageUrl: string): URL {
    const url: URL = new URL('chrome-untrusted://favicon2');
    url.searchParams.set('size', '16');
    url.searchParams.set('scaleFactor', '1x');
    url.searchParams.set('allowGoogleServerFallback', '1');
    url.searchParams.set('pageUrl', pageUrl);
    return url;
  }

  static getInstance(): BrowserProxy {
    return instance || (instance = new BrowserProxyImpl());
  }

  static setInstance(obj: BrowserProxy|null) {
    instance = obj;
  }
}

let instance: BrowserProxy|null = null;
