import 'package:fis_measure/interfaces/date_types/point.dart';
import 'package:fis_measure/interfaces/date_types/rect_region.dart';
import 'package:fis_measure/interfaces/process/modes/mode.dart';
import 'package:fis_measure/interfaces/process/physical_coordinates/physical_coordinate.dart';
import 'package:fis_measure/interfaces/process/visuals/tissue_area.dart';
import 'package:fis_measure/interfaces/process/visuals/visual.dart';
import 'package:fis_measure/process/layout/section.dart';
import 'package:fis_measure/process/physical_coordinates/doppler.dart';
import 'package:fis_measure/process/viewports/tissue_viewport.dart';
import 'package:vid/us/vid_us_2d_visual.dart';
import 'package:vid/us/vid_us_mode.dart';
import 'package:vid/us/vid_us_physical_coordinate.dart';
import 'package:vid/us/vid_us_visual_area_type.dart';

import '../physical_coordinates/convex_tissue.dart';
import '../physical_coordinates/linear_tissue.dart';
import 'visual_area.dart';

class TissueArea extends VisualArea implements ITissueArea {
  TissueArea(
    IVisual visual,
    VidUsVisualAreaType areaType,
    VidUsModeType modeType,
  ) : super(visual, areaType, modeType);

  /// 是否扇形图
  bool get isConvex => viewport?.physical is ConvexTissuePhysicalCoordinate;

  @override
  void loadData() {
    final visualData = visual.visualData as VidUs2DVisual;
    layoutRegion = findRegion(LayoutSections.general);

    ITissuePhysicalCoordinate? physical;
    // TODO: 动态创建
    final physicalInfo = visualData.physicalCoordinates[visualAreaType]!;
    if (physicalInfo is VidUsLinearTissuePhysicalCoordinate) {
      physical = LinearTissuePhysicalCoordinate(physicalInfo);
    } else if (physicalInfo is VidUsConvexTissuePhysicalCoordinate) {
      physical = ConvexTissuePhysicalCoordinate(physicalInfo);
    }

    if (physical == null) return;

    final logicalInfo = visualData.logicalCoordinates[visualAreaType]!;
    final logicalRegion = logicalInfo.region;
    final region = RectRegion.pointTLBR(
      DPoint(logicalRegion.topLeft.x, logicalRegion.topLeft.y),
      DPoint(logicalRegion.bottomRight.x, logicalRegion.bottomRight.y),
    );

    viewport = TissueViewPort(
      this,
      physical,
      logicalInfo.xUnit,
      logicalInfo.yUnit,
      logicalInfo.isFlipHorizontal,
      logicalInfo.isFlipVertical,
      region,
    );
  }
}