/*
 * Copyright 2025 coze-dev Authors
 *
 * 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.
 */
 
/* eslint-disable */

import * as t from '../src/unify/index';
import * as path from 'path';

// const root = 'test/idl';
// const idl = path.resolve(process.cwd(), root, 'dep/common.thrift');
// const document = t.parse(idl, {
//   root,
//   namespaceRefer: true,
//   cache: false,
// });
// // document.body[4]
// console.log('#gg', document);

const indexThriftContent = `
namespace java com.unify_idx

include 'unify_dependent1.thrift'

typedef unify_dependent1.Foo TFoo

enum Gender {
  // male
  Male // male tail
  // female
  Female // female tail
  // mix
  Mix
}

// const map<Gender, string> genderMap = {
//   Gender.Male: '男性',
//   Gender.Female: '女性', 
// }

union FuncRequest {
  1: unify_dependent1.Foo r_key1
  2: TFoo list (go.tag = "json:\\"-\\"")
}
`;

const dep1ThriftContent = `
namespace js unify_dep1

typedef Foo Foo1

struct Foo {
  1: string f_key1
}

`;

// const fileContentMap = {
//   'unify_index.thrift': indexThriftContent,
//   'unify_dependent1.thrift': dep1ThriftContent,
// };

const indexProtoContent = `
syntax = "proto3";

import "unify.dependent1.proto";

package a.b.c;

message Request {
  repeated string key1 = 1[(api.key) = 'f'];
  a.b.Foo key3 = 3;
  // message Sub {
  //   enum Num {
  //     ONE = 1;
  //   }
  //   // string k1 = 1;
  //   Num k2 = 2;
  // }
  // Sub key2 = 2;
}
`;

const dep1ProtoContent = `
syntax = "proto3";

package a.b;

message Foo {
  string f_key1 = 1;
  message SubF {}
  SubF f_key2 = 2;
}
`;

const fileContentMap = {
  'unify_index.proto': indexProtoContent,
  'unify.dependent1.proto': dep1ProtoContent,
};

// const document = t.parse(
//   'unify_index.proto',
//   {
//     root: '.',
//     // namespaceRefer: true,
//   },
//   fileContentMap
// );
// // document.body[4]
// console.log(document);

const baseContent = `
syntax = "proto3";
package a.b;
message Bar {
    message BarSub {
      enum NumBar {
        ONE = 1;
      }
    }
  }
      `;

const extraContent = `
syntax = "proto3";
package a.b;
message Extra {}
`;

const indexContent = `
      syntax = "proto3";

      package a.b;
      import 'base.proto';
      import 'extra.proto';

      message Foo {
      //   message FooSub {
      //     enum NumFoo {
      //       TWO = 2;
      //     }
      //   }

      //   Foo.FooSub.NumFoo k1 = 1;
      //   FooSub.NumFoo k2 = 2;
      //   FooSub k3 = 3;
      //   repeated FooSub k4 = 4;
      //   map<string, FooSub.NumFoo> k5 = 5;

      //   Bar.BarSub.NumBar k10 = 10;
        Bar.BarSub k11 = 11;
        // repeated Bar.BarSub.NumBar k12 = 12;
        // map<string, Bar.BarSub> k13 = 13;
      }

      // message Bar {
      //   message BarSub {
      //     enum NumBar {
      //       ONE = 1;
      //     }
      //   }
      // }
      
      `;

const document = t.parse(
  'index.proto',
  { cache: false },
  {
    'index.proto': indexContent,
    'base.proto': baseContent,
    'extra.proto': extraContent,
  }
);
const statement = document.statements[0] as t.InterfaceWithFields;
console.log(statement);
// const baseContent = `
//       syntax = "proto3";
//       package a.b;
//       message Common {
//       }
//       `;

// const indexContent = `
// syntax = "proto3";
//       message Foo {
//         google.protobuf.Any k1 = 1;
//       }
//       `;

// const document = t.parse(
//   'index.proto',
//   { cache: false },
//   {
//     'index.proto': indexContent,
//     // 'base.proto': baseContent,
//   }
// );

// const { functions } = document.statements[0] as t.ServiceDefinition;
// console.log(functions);
