import { Document, Types } from 'mongoose';

import { IPaginateModel } from '@/shared/interfaces/model.interface';
import { AuditFields } from '@/shared/types/common';
import { TargetType } from '@/shared/constants/enum.constant';


export type TargetMetric = {
  target: number;
  achieved: number;
};

// Base Targets Interface (Clean & concise)
export interface ITargetsBase {
  companyId: Types.ObjectId;
  period: {
    month: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
    year: number;
  };
  targetType: TargetType;
  team?: Types.ObjectId;
  member?: Types.ObjectId;
  salesAmount: TargetMetric;
  unitsSold: TargetMetric;
  meetings: TargetMetric;
  siteVisits: TargetMetric;
  calls: TargetMetric;
}

export interface ITargetsPayload {
  companyId: Types.ObjectId;
  period: {
    month: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;
    year: number;
  };
  targetType: TargetType;
  team?: Types.ObjectId;
  member?: Types.ObjectId;
  salesAmount: number;
  unitsSold: number;
  meetings: number;
  siteVisits: number;
  calls: number;
}

export interface ITargets extends ITargetsBase, AuditFields {}

export interface ITargetsDoc extends ITargets, Document {}

export interface ITargetsModel extends IPaginateModel<ITargetsDoc> {
  isTargetsNameTaken(name: string): Promise<boolean>;
}

export type NewCreatedTargets = ITargetsPayload &
  Partial<Pick<AuditFields, 'createdBy' | 'updatedBy'>>;
export type UpdateTargetsBody = Partial<ITargets>;

export interface PersonalTarget {
  salesAmount: TargetMetric;
  unitsSold: TargetMetric;
  meetings: TargetMetric;
  siteVisits: TargetMetric;
  calls: TargetMetric;
}

export interface TeamMember {
  memberId?: string;
  name: string;
  salesAmount: TargetMetric;
  unitsSold: TargetMetric;
  meetings: TargetMetric;
  siteVisits: TargetMetric;
  calls: TargetMetric;
}

export interface TargetSummaryResponse {
  personal?: PersonalTarget | null;
  team?: {
    salesAmount: TargetMetric;
    unitsSold: TargetMetric;
    meetings: TargetMetric;
    siteVisits: TargetMetric;
    calls: TargetMetric;
  };
  teamMembers?: TeamMember[];
  graphData?: {
    month: string;
    salesTarget: number;
    salesAchieved: number;
    unitsTarget: number;
    unitsAchieved: number;
  }[];
}