/* global React */
const { useState, useEffect, useRef, useMemo, useCallback } = React;

/* ============================================================
   PIXEL PET SPRITES
   Original chunky pixel-art creatures drawn with CSS box-shadow
   ============================================================ */

// Encode pet sprite as a 14×14 grid string. Characters map to palette colors.
// . = transparent, the rest are indexes into the palette array.
function PixelSprite({ map, palette, size = 96, scale = 1 }) {
  const grid = map.trim().split('\n').map(r => r.trim());
  const rows = grid.length;
  const cols = grid[0].length;
  const px = Math.floor((size * scale) / Math.max(rows, cols));

  // Build CSS box-shadow string
  const shadows = [];
  for (let y = 0; y < rows; y++) {
    for (let x = 0; x < cols; x++) {
      const ch = grid[y][x];
      if (ch === '.') continue;
      const idx = parseInt(ch, 16);
      if (Number.isNaN(idx)) continue;
      const color = palette[idx];
      if (!color) continue;
      shadows.push(`${x * px}px ${y * px}px 0 0 ${color}`);
    }
  }

  return (
    <div
      style={{
        width: cols * px,
        height: rows * px,
        position: 'relative',
        display: 'inline-block',
      }}
      aria-hidden="true"
    >
      <div
        style={{
          width: px,
          height: px,
          position: 'absolute',
          left: 0,
          top: 0,
          boxShadow: shadows.join(', '),
          backgroundColor: 'transparent',
        }}
      />
    </div>
  );
}

/* ------------- Pet definitions ------------- */
// Each pet has multiple mood maps for state changes.

const PETS = {
  // 1. Capy — the default (homage to the built-in)
  capy: {
    name: "Capy",
    blurb: "Calm, slow to anger, lives for naps. Default companion.",
    palette: {
      idle:    [null, '#3b2418', '#8a4d28', '#b8693a', '#d68a4d', '#1a1208', '#fff3d4', '#222'],
      running: [null, '#3b2418', '#8a4d28', '#b8693a', '#d68a4d', '#1a1208', '#fff3d4', '#00D6A3'],
      error:   [null, '#3b2418', '#8a4d28', '#b8693a', '#d68a4d', '#1a1208', '#fff3d4', '#FF7A59'],
      sleep:   [null, '#3b2418', '#6a3b1c', '#8a4d28', '#a85e30', '#1a1208', '#fff3d4', '#B785F5'],
    },
    sprites: {
      idle: `
..............
....122221....
...12333321...
..1233444331..
.123444444321.
.123466646421.
.123451115421.
.123455555421.
.124444444421.
..2244444422..
...22222222...
....1....1....
....1....1....
..............`,
      running: `
..............
....122221....
...12333321...
..1233444331..
.123444444321.
.123466646421.
.123451115421.
.127455555421.
.124444444421.
..2244444422..
...22222222...
...1......1...
..11........1.
..............`,
      error: `
..............
....122221....
...12333321...
..1233444331..
.123444444321.
.123466646421.
.123451115421.
.123477777421.
.124444444421.
..2244444422..
...22222222...
....1....1....
....1....1....
..............`,
      sleep: `
..............
..............
..............
....122221....
...12333321...
..1233333321..
.123333333321.
.123577775321.
.123333333321.
..2233333322..
...22222222...
....1....1....
....1....1....
..............`,
    },
  },

  // 2. Bloop — round blob
  bloop: {
    name: "Bloop",
    blurb: "Translucent jelly. Wobbles when tools sync. Likes parallel work.",
    palette: {
      idle:    [null, '#0a3528', '#157352', '#22a87b', '#3fd9a3', '#0a1a14', '#fff', '#222'],
      running: [null, '#0a3528', '#157352', '#22a87b', '#3fd9a3', '#0a1a14', '#fff', '#006BFF'],
      error:   [null, '#3a0a0a', '#731515', '#a83333', '#d95e5e', '#1a0a0a', '#fff', '#FF7A59'],
      sleep:   [null, '#1a2a3a', '#2a4a6a', '#3a6a8a', '#5a8aaa', '#0a1520', '#fff', '#B785F5'],
    },
    sprites: {
      idle: `
..............
..............
.....2222.....
....233332....
...23344432...
..2334444432..
.234444444432.
.234566664432.
.234555554432.
.234444444432.
.234444444432.
..2334444332..
...233333322..
....222222....`,
      running: `
..............
....2222......
...233332.....
..23344432....
.234444432....
.234666432....
.234555432....
.234444432....
.234444432....
..2334432.....
...23332......
....22........
..............
..............`,
      error: `
..............
..............
.....2222.....
....233332....
...23344432...
..2334444432..
.234444444432.
.234577775432.
.234555554432.
.234444444432.
.234444444432.
..2334444332..
...233333322..
....222222....`,
      sleep: `
..............
..............
..............
.....2222.....
....233332....
...23344432...
..2334444432..
.234577775432.
.234555554432.
.234444444432.
..2334444332..
...233333322..
....222222....
..............`,
    },
  },

  // 3. Slime — small triangular
  slime: {
    name: "Slime",
    blurb: "Tiny. Stoic. Glows softly when an agent finishes a run.",
    palette: {
      idle:    [null, '#1a1535', '#3a2f6a', '#6249a8', '#8a7ad4', '#0a081a', '#fff', '#222'],
      running: [null, '#1a1535', '#3a2f6a', '#6249a8', '#8a7ad4', '#0a081a', '#fff', '#00D6A3'],
      error:   [null, '#3a0a0a', '#6a1515', '#a83333', '#d97a7a', '#1a0a0a', '#fff', '#FF7A59'],
      sleep:   [null, '#15151a', '#2a2a3a', '#3a3a5a', '#5a5a7a', '#0a0a15', '#fff', '#B785F5'],
    },
    sprites: {
      idle: `
..............
..............
......22......
.....2332.....
....233332....
...23344432...
..2334444432..
.233444444432.
.234566664432.
.234555554432.
.234444444432.
.234444444432.
..3344444332..
...33333322...`,
      running: `
..............
......22......
.....2332.....
....233332....
...23344432...
..2334444432..
.233666664432.
.234555554432.
.234444444432.
..3344444332..
...33333322...
..............
..............
..............`,
      error: `
..............
......22......
.....2332.....
....233332....
...23344432...
..2334444432..
.233444444432.
.234577775432.
.234555554432.
.234444444432.
.234444444432.
..3344444332..
...33333322...
..............`,
      sleep: `
..............
..............
..............
......22......
.....2332.....
....233332....
...23344432...
..2334444432..
.234577775432.
.234555554432.
.234444444432.
..3344444332..
...33333322...
..............`,
    },
  },

  // 4. Ghost — wispy
  ghost: {
    name: "Wisp",
    blurb: "Hovers, doesn't walk. Best for long-running background runs.",
    palette: {
      idle:    [null, '#2a2a2a', '#5a5a5a', '#8a8a8a', '#d4d4d4', '#0a0a0a', '#fff', '#222'],
      running: [null, '#2a2a2a', '#5a5a5a', '#8a8a8a', '#d4d4d4', '#0a0a0a', '#fff', '#00D6A3'],
      error:   [null, '#3a1a1a', '#6a3a3a', '#a85a5a', '#d4a8a8', '#1a0a0a', '#fff', '#FF7A59'],
      sleep:   [null, '#1a1a3a', '#3a3a6a', '#5a5aa8', '#8a8ad4', '#0a0a1a', '#fff', '#B785F5'],
    },
    sprites: {
      idle: `
..............
.....2222.....
....233332....
...23344432...
..2334444432..
.234444444432.
.234466644432.
.234455544432.
.234444444432.
.234444444432.
.234444444432.
.23444444443..
.234.43443.43.
.2.2..2.2..2..`,
      running: `
.....2222.....
....233332....
...23344432...
..2334444432..
.234466644432.
.234455544432.
.234444444432.
.234444444432.
.234444444432.
.23444444443..
.234.43443.43.
.2.2..2.2..2..
..............
..............`,
      error: `
..............
.....2222.....
....233332....
...23344432...
..2334444432..
.234444444432.
.234477744432.
.234455544432.
.234444444432.
.234444444432.
.234444444432.
.23444444443..
.234.43443.43.
.2.2..2.2..2..`,
      sleep: `
..............
..............
.....2222.....
....233332....
...23344432...
..2334444432..
.234477744432.
.234455544432.
.234444444432.
.234444444432.
.23444444443..
.234.43443.43.
.2.2..2.2..2..
..............`,
    },
  },

  // 5. Bun — long-eared
  bun: {
    name: "Mochi",
    blurb: "Long-eared, low-bandwidth. Ears droop on rate-limit.",
    palette: {
      idle:    [null, '#2a1a1a', '#6a4a3a', '#a8806a', '#e6c8a8', '#0a0a0a', '#fff', '#222'],
      running: [null, '#2a1a1a', '#6a4a3a', '#a8806a', '#e6c8a8', '#0a0a0a', '#fff', '#00D6A3'],
      error:   [null, '#3a0a0a', '#6a3030', '#a85a5a', '#e6a8a8', '#1a0a0a', '#fff', '#FF7A59'],
      sleep:   [null, '#1a1a2a', '#3a3a5a', '#5a5a8a', '#a8a8c8', '#0a0a15', '#fff', '#B785F5'],
    },
    sprites: {
      idle: `
....22..22....
....23..32....
....23..32....
....23..32....
....233332....
...23344432...
..2334444432..
.234444444432.
.234466664432.
.234455554432.
.234444444432.
.234444444432.
..2244444422..
...22222222...`,
      running: `
....22..22....
....23..32....
....23..32....
....233332....
...23344432...
..2334444432..
.234466664432.
.234455554432.
.234444444432.
.234444444432.
..2244444422..
..2.222222.2..
.2..2....2..2.
..............`,
      error: `
....22..22....
....23..32....
....23..32....
....23..32....
....233332....
...23344432...
..2334444432..
.234444444432.
.234477774432.
.234455554432.
.234444444432.
.234444444432.
..2244444422..
...22222222...`,
      sleep: `
..............
..............
....22..22....
....23..32....
....233332....
...23344432...
..2334444432..
.234477774432.
.234455554432.
.234444444432.
.234444444432.
..2244444422..
...22222222...
..............`,
    },
  },

  // 6. Cubey — angular
  cubey: {
    name: "Cubey",
    blurb: "Engineer favourite. Three eyes — one per active worktree.",
    palette: {
      idle:    [null, '#1a2535', '#2f4a6a', '#4d7aa8', '#7aa8d4', '#0a1020', '#fff', '#222'],
      running: [null, '#1a2535', '#2f4a6a', '#4d7aa8', '#7aa8d4', '#0a1020', '#fff', '#00D6A3'],
      error:   [null, '#351a1a', '#6a2f2f', '#a84d4d', '#d47a7a', '#200a0a', '#fff', '#FF7A59'],
      sleep:   [null, '#1a1a35', '#2f2f6a', '#4d4da8', '#7a7ad4', '#0a0a20', '#fff', '#B785F5'],
    },
    sprites: {
      idle: `
..............
.222222222222.
.233333333332.
.234444444432.
.234444444432.
.234646464432.
.234555555432.
.234555555432.
.234444444432.
.234444444432.
.234444444432.
.233333333332.
.222222222222.
..............`,
      running: `
.222222222222.
.233333333332.
.234444444432.
.236464646432.
.234555555432.
.234555555432.
.234444444432.
.234444444432.
.234444444432.
.233333333332.
.222222222222.
..2.2.22.2.2..
..2..2..2..2..
..............`,
      error: `
..............
.222222222222.
.233333333332.
.234444444432.
.234444444432.
.234747474432.
.234555555432.
.234555555432.
.234444444432.
.234444444432.
.234444444432.
.233333333332.
.222222222222.
..............`,
      sleep: `
..............
..............
.222222222222.
.233333333332.
.234444444432.
.234444444432.
.234777777432.
.234555555432.
.234444444432.
.234444444432.
.233333333332.
.222222222222.
..............
..............`,
    },
  },

  // 7. Owl — feathered
  owl: {
    name: "Owl",
    blurb: "Nocturnal. Watches sleeping queues — wakes you only when it matters.",
    palette: {
      idle:    [null, '#2a1f15', '#6a4a30', '#a87d50', '#d4b07a', '#0a0805', '#fff', '#222', '#ffb547'],
      running: [null, '#2a1f15', '#6a4a30', '#a87d50', '#d4b07a', '#0a0805', '#fff', '#00D6A3', '#ffb547'],
      error:   [null, '#2a1f15', '#6a4a30', '#a87d50', '#d4b07a', '#0a0805', '#fff', '#FF7A59', '#ffb547'],
      sleep:   [null, '#2a2535', '#4a456a', '#6a65a8', '#9a95d4', '#0a0815', '#fff', '#B785F5', '#7a75c8'],
    },
    sprites: {
      idle: `
....2....2....
...23....32...
...233..332...
..23344..32...
..23344..432..
.2334488443.2.
.2346868644.2.
.234688886432.
.234555555432.
.234444444432.
.234444444432.
.234444444432.
..2244444422..
...22.22.22...`,
      running: `
...23....32...
...233..332...
..23344..32...
..23344..432..
.2334488443.2.
.2346868644.2.
.234688886432.
.234555555432.
.234444444432.
.234444444432.
..2244444422..
..2.222222.2..
.2..2....2..2.
..............`,
      error: `
....2....2....
...23....32...
..2344..4432..
.2334488443.2.
.2347878744.2.
.234788887432.
.234555555432.
.234444444432.
.234444444432.
.234444444432.
..2244444422..
...22.22.22...
..............
..............`,
      sleep: `
..............
....2....2....
...23....32...
...233..332...
..23344..432..
.2334488443.2.
.2347777744.2.
.234555555432.
.234444444432.
.234444444432.
..2244444422..
...22.22.22...
..............
..............`,
    },
  },

  // 8. Pixel-cat
  cat: {
    name: "Tuna",
    blurb: "Knocks things off your desk. Pounces at the first approval prompt.",
    palette: {
      idle:    [null, '#1a1a1a', '#3a3a3a', '#6a6a6a', '#a8a8a8', '#0a0a0a', '#fff', '#222', '#FFB547'],
      running: [null, '#1a1a1a', '#3a3a3a', '#6a6a6a', '#a8a8a8', '#0a0a0a', '#fff', '#00D6A3', '#FFB547'],
      error:   [null, '#1a1a1a', '#3a3a3a', '#6a6a6a', '#a8a8a8', '#0a0a0a', '#fff', '#FF7A59', '#FFB547'],
      sleep:   [null, '#1a1a35', '#3a3a6a', '#6a6aa8', '#a8a8d4', '#0a0a15', '#fff', '#B785F5', '#FFB547'],
    },
    sprites: {
      idle: `
..2222....2222
..2333....2332
..23334..43332
..23334..43332
..2334444443322
..2334444443322
..234688866432
..234555556432
..234444444432
..234444444432
..234444444432
..234454454432
..2344444443.2
...22.22.22..2`,
      running: `
..2222....2222
..2333....2332
..23334..43332
..2334444443322
..234666666432
..234555555432
..234444444432
..234444444432
..234454454432
..2344444443.2
..2244444433.2
..............
..............
..............`,
      error: `
..2222....2222
..2333....2332
..23334..43332
..23334..43332
..2334444443322
..234777777432
..234555555432
..234444444432
..234444444432
..234444444432
..234454454432
..2344444443.2
...22.22.22..2
..............`,
      sleep: `
..............
..............
....2222.222..
...2333.2332..
..23334.43332.
.2334444444332
.234777777432.
.234555555432.
.234444444432.
.234444444432.
.234454454432.
.234444444432.
..234444443.2.
...22.22.22.2.`,
    },
  },
};

/* ------------- PetSprite component ------------- */

function PetSprite({ pet = "capy", state = "idle", size = 96, framed = true, hoverState = null }) {
  const def = PETS[pet] || PETS.capy;
  // Map full state names to sprite-key categories
  const stateKey = (s) => {
    if (!s) return 'idle';
    if (s === 'sleeping' || s === 'rateLimit') return 'sleep';
    if (s === 'error' || s === 'waitingInput' || s === 'approval') return 'error';
    if (s === 'running' || s === 'review') return 'running';
    return 'idle';
  };
  const [hover, setHover] = useState(false);
  const activeState = hover && hoverState ? hoverState : state;
  const sk = stateKey(activeState);
  const sprite = def.sprites[sk] || def.sprites.idle;
  const palette = def.palette[sk] || def.palette.idle;

  const content = (
    <PixelSprite map={sprite} palette={palette} size={size} />
  );

  if (!framed) return content;

  return (
    <div
      className="pet-frame"
      style={{ width: size + 24, height: size + 24, padding: 12 }}
      onMouseEnter={() => setHover(true)}
      onMouseLeave={() => setHover(false)}
      role="img"
      aria-label={`${def.name}, ${activeState} state`}
    >
      <div style={{ width: size, height: size, display: 'grid', placeItems: 'center' }}>
        {content}
      </div>
    </div>
  );
}

Object.assign(window, { PETS, PixelSprite, PetSprite });
