import { imgSnapshotTest, urlSnapshotTest } from '../../helpers/util.ts';

describe.skip('architecture diagram', () => {
  it('should render a simple architecture diagram with groups', () => {
    imgSnapshotTest(
      `architecture-beta
                group api(cloud)[API]

                service db(database)[Database] in api
                service disk1(disk)[Storage] in api
                service disk2(disk)[Storage] in api
                service server(server)[Server] in api
                service gateway(internet)[Gateway] 

                db L--R server
                disk1 T--B server
                disk2 T--B db
                server T--B gateway
            `
    );
  });
  it('should render a simple architecture diagram with titleAndAccessibilities', () => {
    imgSnapshotTest(
      `architecture-beta
          title Simple Architecture Diagram
          accTitle: Accessibility Title
          accDescr: Accessibility Description
          group api(cloud)[API]

          service db(database)[Database] in api
          service disk1(disk)[Storage] in api
          service disk2(disk)[Storage] in api
          service server(server)[Server] in api

          db:L -- R:server
          disk1:T -- B:server
          disk2:T -- B:db
      `
    );
  });
  it('should render an architecture diagram with groups within groups', () => {
    imgSnapshotTest(
      `architecture-beta
                group api[API]
                group public[Public API] in api
                group private[Private API] in api
        
                service serv1(server)[Server] in public
        
                service serv2(server)[Server] in private
                service db(database)[Database] in private
        
                service gateway(internet)[Gateway] in api
        
                serv1 B--T serv2
                serv2 L--R db
                serv1 L--R gateway
            `
    );
  });
  it('should render an architecture diagram with the fallback icon', () => {
    imgSnapshotTest(
      `architecture-beta
                service unknown(iconnamedoesntexist)[Unknown Icon]
            `
    );
  });
  it('should render an architecture diagram with split directioning', () => {
    imgSnapshotTest(
      `architecture-beta
                service db(database)[Database]
                service s3(disk)[Storage]
                service serv1(server)[Server 1]
                service serv2(server)[Server 2]
                service disk(disk)[Disk]
        
                db L--R s3
                serv1 L--T s3
                serv2 L--B s3
                serv1 T--B disk
            `
    );
  });
  it('should render an architecture diagram with directional arrows', () => {
    imgSnapshotTest(
      `architecture-beta
                service servC(server)[Server 1]
                service servL(server)[Server 2]
                service servR(server)[Server 3]
                service servT(server)[Server 4]
                service servB(server)[Server 5]
        
                servC (L--R) servL
                servC (R--L) servR
                servC (T--B) servT
                servC (B--T) servB
        
                servL (T--L) servT
                servL (B--L) servB
                servR (T--R) servT
                servR (B--R) servB
            `
    );
  });
  it('should render an architecture diagram with group edges', () => {
    imgSnapshotTest(
      `architecture-beta
                group left_group(cloud)[Left]
                group right_group(cloud)[Right]
                group top_group(cloud)[Top]
                group bottom_group(cloud)[Bottom]
                group center_group(cloud)[Center]
        
                service left_disk(disk)[Disk] in left_group
                service right_disk(disk)[Disk] in right_group
                service top_disk(disk)[Disk] in top_group
                service bottom_disk(disk)[Disk] in bottom_group
                service center_disk(disk)[Disk] in center_group
        
                left_disk{group} (R--L) center_disk{group}
                right_disk{group} (L--R) center_disk{group}
                top_disk{group} (B--T) center_disk{group}
                bottom_disk{group} (T--B) center_disk{group}
            `
    );
  });
  it('should render an architecture diagram with edge labels', () => {
    imgSnapshotTest(
      `architecture-beta
                service servC(server)[Server 1]
                service servL(server)[Server 2]
                service servR(server)[Server 3]
                service servT(server)[Server 4]
                service servB(server)[Server 5]
        
                servC L-[Label]-R servL
                servC R-[Label]-L servR
                servC T-[Label]-B servT
                servC B-[Label]-T servB
        
                servL T-[Label]-L servT
                servL B-[Label]-L servB
                servR T-[Label]-R servT
                servR B-[Label]-R servB
            `
    );
  });
  it('should render an architecture diagram with simple junction edges', () => {
    imgSnapshotTest(
      `architecture-beta
                service left_disk(disk)[Disk]
                service top_disk(disk)[Disk]
                service bottom_disk(disk)[Disk]
                service top_gateway(internet)[Gateway]
                service bottom_gateway(internet)[Gateway]
                junction juncC
                junction juncR
        
                left_disk R--L juncC
                top_disk B--T juncC
                bottom_disk T--B juncC
                juncC R--L juncR
                top_gateway B--T juncR
                bottom_gateway T--B juncR
            `
    );
  });
  it('should render an architecture diagram with complex junction edges', () => {
    imgSnapshotTest(
      `architecture-beta
                group left
                group right
                service left_disk(disk)[Disk] in left
                service top_disk(disk)[Disk] in left
                service bottom_disk(disk)[Disk] in left
                service top_gateway(internet)[Gateway] in right
                service bottom_gateway(internet)[Gateway] in right
                junction juncC in left
                junction juncR in right
        
                left_disk R--L juncC
                top_disk B--T juncC
                bottom_disk T--B juncC
        
        
                top_gateway (B--T juncR
                bottom_gateway (T--B juncR
        
                juncC{group} R--L) juncR{group}
            `
    );
  });

  it('should render an architecture diagram with a reasonable height', () => {
    imgSnapshotTest(
      `architecture-beta
              group federated(cloud)[Federated Environment]
                  service server1(server)[System] in federated
                  service edge(server)[Edge Device] in federated
                  server1:R -- L:edge

              group on_prem(cloud)[Hub]
                  service firewall(server)[Firewall Device] in on_prem
                  service server(server)[Server] in on_prem
                  firewall:R -- L:server

                  service db1(database)[db1] in on_prem
                  service db2(database)[db2] in on_prem
                  service db3(database)[db3] in on_prem
                  service db4(database)[db4] in on_prem
                  service db5(database)[db5] in on_prem
                  service db6(database)[db6] in on_prem

                  junction mid in on_prem
                  server:B -- T:mid

                  junction 1Leftofmid in on_prem
                  1Leftofmid:R -- L:mid
                  1Leftofmid:B -- T:db1

                  junction 2Leftofmid in on_prem
                  2Leftofmid:R -- L:1Leftofmid
                  2Leftofmid:B -- T:db2

                  junction 3Leftofmid in on_prem
                  3Leftofmid:R -- L:2Leftofmid
                  3Leftofmid:B -- T:db3

                  junction 1RightOfMid in on_prem
                  mid:R -- L:1RightOfMid
                  1RightOfMid:B -- T:db4
                  
                  junction 2RightOfMid in on_prem
                  1RightOfMid:R -- L:2RightOfMid
                  2RightOfMid:B -- T:db5        
                  
                  junction 3RightOfMid in on_prem
                  2RightOfMid:R -- L:3RightOfMid
                  3RightOfMid:B -- T:db6         

                  edge:R -- L:firewall
      `
    );
  });
});

// Skipped as the layout is not deterministic, and causes issues in E2E tests.
describe.skip('architecture - external', () => {
  it('should allow adding external icons', () => {
    urlSnapshotTest('http://localhost:9000/architecture-external.html');
  });
});
