import mongoose, { Schema, Document } from 'mongoose';

export interface IZiplinePuzzle extends Document {
  title: string;
  description: string;

  grid: number[][];

  numbers: {
    row: number;
    col: number;
    value: number;
  }[];

  blocks: {
    row: number;
    col: number;
  }[];

  // solution: {
  //   path: [number, number][];
  // };

  difficulty: 'easy' | 'medium' | 'hard';

  is_active: boolean;

  createdAt: Date;
}

const ZiplinePuzzleSchema: Schema = new Schema({
  title: {
    type: String,
    required: true,
    trim: true,
  },

  description: {
    type: String,
    required: true,
    trim: true,
  },

  grid: {
    type: [[Number]],
    required: true,
  },

  numbers: [
    {
      row: {
        type: Number,
        required: true,
      },

      col: {
        type: Number,
        required: true,
      },

      value: {
        type: Number,
        required: true,
      },
    },
  ],

  blocks: [
    {
      row: {
        type: Number,
        required: true,
      },

      col: {
        type: Number,
        required: true,
      },
    },
  ],

  // solution: {
  //   path: {
  //     type: [[Number]],
  //     required: true,
  //     validate: {
  //       validator: function (value: number[][]) {
  //         return (
  //           Array.isArray(value) &&
  //           value.length > 1 &&
  //           value.every(
  //             (coord) =>
  //               Array.isArray(coord) &&
  //               coord.length === 2 &&
  //               coord.every((n) => Number.isInteger(n)),
  //           )
  //         );
  //       },
  //       message:
  //         "solution.path must be an array of [row, col] integer coordinates",
  //     },
  //   },
  // },

  difficulty: {
    type: String,
    enum: ['easy', 'medium', 'hard'],
    default: 'easy',
  },

  is_active: {
    type: Boolean,
    default: true,
  },

  createdAt: {
    type: Date,
    default: Date.now,
  },
});

export default mongoose.model<IZiplinePuzzle>(
  'ZiplinePuzzle',
  ZiplinePuzzleSchema
);