import { createEncoderFactory, DeriveEncoding, Encoder, DeriveChannelOutputs } from 'encodable';

type ChoroplethMapEncodingConfig = {
  key: ['Text', string];
  fill: ['Color', string];
  opacity: ['Numeric', number];
  stroke: ['Color', string];
  strokeWidth: ['Numeric', number];
  tooltip: ['Text', string, 'multiple'];
};

export type ChoroplethMapEncoding = DeriveEncoding<ChoroplethMapEncodingConfig>;

export type ChoroplethMapEncoder = Encoder<ChoroplethMapEncodingConfig>;

export type ChoroplethMapChannelOutputs = DeriveChannelOutputs<ChoroplethMapEncodingConfig>;

export const DefaultChannelOutputs = {
  key: '',
  fill: '#f0f0f0',
  opacity: 1,
  stroke: '#ccc',
  strokeWidth: 1,
};

export const choroplethMapEncoderFactory = createEncoderFactory<ChoroplethMapEncodingConfig>({
  channelTypes: {
    key: 'Text',
    fill: 'Color',
    opacity: 'Numeric',
    stroke: 'Color',
    strokeWidth: 'Numeric',
    tooltip: 'Text',
  },
  defaultEncoding: {
    key: { field: 'key', title: 'Location' },
    fill: { value: DefaultChannelOutputs.fill },
    opacity: { value: DefaultChannelOutputs.opacity },
    stroke: { value: DefaultChannelOutputs.stroke },
    strokeWidth: { value: DefaultChannelOutputs.strokeWidth },
    tooltip: [],
  },
});
