#pragma once

namespace xtr {

namespace doc { class RSFormDoc; } // namespace doc

class ExtSourceManager final : public ccl::SourceManager {
public:
  [[nodiscard]] bool TestDomain(const ccl::src::Descriptor& global, 
                  const std::u8string& domain) const override;

  [[nodiscard]] ccl::src::Descriptor 
    Convert2Local(const ccl::src::Descriptor& global,
                  const std::u8string& domain) const override;

  [[nodiscard]] ccl::src::Descriptor 
    Convert2Global(const ccl::src::Descriptor& local,
                    const std::u8string& domain) const override;

  [[nodiscard]] ccl::src::Descriptor 
    CreateLocalDesc(ccl::src::SrcType type,
                    std::u8string localName) const override;
  [[nodiscard]] ccl::src::Source* Find(const ccl::src::Descriptor& desc) override;
  [[nodiscard]] ccl::src::Descriptor GetDescriptor(const ccl::src::Source& src) const override;
  bool ChangeDescriptor(const ccl::src::Descriptor& desc, const ccl::src::Descriptor& newDesc) override;

  [[nodiscard]] ccl::src::Source* CreateNew(const ccl::src::Descriptor& desc) override;
  [[nodiscard]] ccl::src::Source* Open(const ccl::src::Descriptor& desc) override;
  void Close(ccl::src::Source& src) override;
  bool SaveState(ccl::src::Source& src) override;
  void Discard(const ccl::src::Descriptor& desc) override;

private:
  static const doc::RSFormDoc& RSCast(const ccl::src::Source& src);
  static doc::RSFormDoc& RSCast(ccl::src::Source& src);

  [[nodiscard]] static std::u8string FixFilename(const std::u8string& name);
};

} // namespace xtr