#include "sfnt.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "embed.h"

struct _FONTFILE {
  OTF_FILE *sfnt;
  // CFF *;
};

#if 0
enum { TTF_OTF, TYPE1 } inputFile;
if (TTF_OTF) {
  assert(!TTC);
  if (CFF/OTF) {
    // or EMB_PDF_FONTFILE3_OTF [unstripped]
    if (CIDfont) {
      asset(multiBYTE);
      strip_sfnt() // "CIDFontType0"  EMB_PDF_FONTFILE3_CID0C
    } else {
      ... strip_sfnt();
    }
  } else {
    ...
  }
} else if (TYPE1) {
  assert(!MMType1);
  assert(!OCF);
  assert(!WrappedCID_CFF);
  ... convert_to_cff()
}
// not supported: MMType1 Type3
#endif

#include <string.h>

static void example_outfn(const char *buf,int len,void *context) // {{{
{
  FILE *f=(FILE *)context;
  if (fwrite(buf,1,len,f)!=len) {
    fprintf(stderr,"Short write: %m\n");
    assert(0);
    return;
  }
}
// }}}

void example_write_fontdescr(OTF_FILE *otf,const char *outfile) // {{{
{
  struct _FONTFILE ff; ff.sfnt=otf; // TODO
  EMB_PARAMS *emb=emb_new(&ff,
                          EMB_DEST_PDF16,
//                          EMB_C_KEEP_T1 
                          EMB_C_FORCE_MULTIBYTE

                          );
  EMB_PDF_FONTDESCR *fdes=emb_pdf_fontdescr(emb);
  assert(fdes);
  assert(emb->subset);

  bit_set(emb->subset,otf_from_unicode(otf,'a'));
  bit_set(emb->subset,otf_from_unicode(otf,0x400));

  EMB_PDF_FONTWIDTHS *fwid=emb_pdf_fontwidths(emb);
  assert(fwid);

  printf("0 0 obj\n");
  char *res=emb_pdf_simple_fontdescr(emb,fdes,1);
  assert(res);
  fputs(res,stdout);
  free(res);
  printf("endobj\n");

  printf("1 0 obj\n"
         "<<\n");
  if (emb_pdf_get_fontfile_subtype(emb)) {
    printf("  /SubType /%s\n",
           emb_pdf_get_fontfile_subtype(emb));
  }
  if (emb->outtype&EMB_OUTPUT_T1) {
    printf("  /Length1 ?\n"
           "  /Length2 ?\n"
           "  /Length3 ?\n");
  } else {
    printf("  /Length1 2 0 R\n");
  }
  printf("  /Length 2 0 R\n" // maybe compress it...
         ">>\n"
         "stream\n");
  int outlen=0; // TODO
// TODO
  if (outfile) {
    FILE *f=fopen(outfile,"w");
    if (!f) {
      fprintf(stderr,"Opening \"%s\" for writing failed: %m\n",outfile);
      assert(0);
      return;
    }
    outlen=emb_embed(emb,example_outfn,f);
//    outlen=otf_ttc_extract(emb->font->sfnt,example_outfn,f);
    fclose(f);
  }
puts("...");
  printf("endstream\n"
         "endobj\n");
  printf("2 0 obj\n"
         "%d\n" 
         "endobj\n",
         outlen
         );

  printf("3 0 obj\n");
  res=emb_pdf_simple_font(emb,fdes,fwid,0);
  assert(res);
  fputs(res,stdout);
  free(res);
  printf("endobj\n");

  if (emb->plan&EMB_A_MULTIBYTE) {
    printf("4 0 obj\n");
    res=emb_pdf_simple_cidfont(emb,fdes->fontname,3);
    assert(res);
    fputs(res,stdout);
    free(res);
    printf("endobj\n");
  }

  free(fdes);
  free(fwid);
}
// }}}

// TODO? reencode?
int main(int argc,char **argv) 
{
  const char *fn="/usr/share/fonts/truetype/microsoft/ARIALN.TTF";
  if (argc==2) {
    fn=argv[1];
  }
  OTF_FILE *otf=otf_load(fn);
  assert(otf);
  printf("width(4): %d\n",otf_get_width(otf,4));


  if (strcmp(fn,"test.ttf")!=0) {
    example_write_fontdescr(otf,"test.ttf");
  } else {
    example_write_fontdescr(otf,NULL);
  }

  // show_post(otf);

  // show_name(otf);

  // show_cmap(otf);
  // printf("%d %d\n",otf_from_unicode(otf,'A'),0);

  // ... name 6 -> FontName  /20(cid)
  // ? StemV Flags(?) from FontName 

  otf_close(otf);

  return 0;
}
