// ignore_for_file: public_member_api_docs, sort_constructors_first
import 'dart:convert';
import 'dart:ui';

import 'package:enum_to_string/enum_to_string.dart';
import 'package:rrispat_app/src/features/ticket/ticket_enums.dart';

class TicketModel {
  String id;
  String createdBy;
  String userDepartment;
  String assignTo;
  String againstDepartment;
  String hod;
  String subDepartment;
  String teamLead;
  int timeDuration;
  String description;
  DateTime? createdAt;
  TicketStatus status;
  int userRating;
  UserReviewStatus userReviewStatus;
  String rejectionRemark;
  String reviewRemark;
  List<String> solutionRemarks = [];
  DateTime? assigningTime;
  DateTime? estimatedTime;

  TicketModel({
    this.id = '',
    this.createdBy = '',
    this.userDepartment = '',
    this.assignTo = '',
    this.againstDepartment = '',
    this.hod = '',
    this.subDepartment = '',
    this.teamLead = '',
    this.timeDuration = 0,
    this.description = '',
    this.userRating = 0,
    this.rejectionRemark = '',
    this.reviewRemark = '',
    this.solutionRemarks = const [],
    this.userReviewStatus = UserReviewStatus.reviewNotReceived,
    this.createdAt,
    this.assigningTime,
    this.estimatedTime,

    this.status = TicketStatus.created,
    // required this.status,
  });

  TicketModel copyWith({
    String? id,
    String? createdBy,
    String? userDepartment,
    String? assignTo,
    String? againstDepartment,
    String? hod,
    String? subDepartment,
    String? teamLead,
    int? timeDuration,
    String? description,
    int? userRating,
    UserReviewStatus? userReviewStatus,
    String? rejectionRemark,
    String? reviewRemark,
    List<String>? solutionRemarks,
    DateTime? createdAt,
    TicketStatus? status,
  }) {
    return TicketModel(
      id: id ?? this.id,
      createdBy: createdBy ?? this.createdBy,
      userDepartment: userDepartment ?? this.userDepartment,
      assignTo: assignTo ?? this.assignTo,
      againstDepartment: againstDepartment ?? this.againstDepartment,
      hod: hod ?? this.hod,
      subDepartment: subDepartment ?? this.subDepartment,
      teamLead: teamLead ?? this.teamLead,
      timeDuration: timeDuration ?? this.timeDuration,
      description: description ?? this.description,
      userRating: userRating ?? this.userRating,
      userReviewStatus: userReviewStatus ?? this.userReviewStatus,
      rejectionRemark: rejectionRemark ?? this.rejectionRemark,
      reviewRemark: reviewRemark ?? this.reviewRemark,
      solutionRemarks: solutionRemarks ?? this.solutionRemarks,
      createdAt: createdAt ?? this.createdAt,
      status: status ?? this.status,
    );
  }

  Map<String, dynamic> toMap() {
    return <String, dynamic>{
      'id': id,
      'createdBy': createdBy,
      'userDepartment': userDepartment,
      'assignTo': assignTo,
      'againstDepartment': againstDepartment,
      'hod': hod,
      'subDepartment': subDepartment,
      'teamLead': teamLead,
      'timeDuration': timeDuration,
      'description': description,
      'userRating': userRating,
      'userReviewStatus': userReviewStatus.name,
      'rejectionRemark': rejectionRemark,
      'reviewRemark': reviewRemark,
      'solutionRemarks': solutionRemarks,
      'createdAt': createdAt?.millisecondsSinceEpoch,
      'status': status.name,
    };
  }

  factory TicketModel.fromMap(Map<String, dynamic> map) {
    return TicketModel(
      id: map['_id'] as String,
      createdBy: (map['createdBy'] ?? '') as String,
      userDepartment: (map['userDepartment'] ?? '') as String,
      assignTo: (map['assignTo'] ?? '') as String,
      againstDepartment: (map['againstDepartment'] ?? '') as String,
      hod: (map['hod'] ?? '') as String,
      subDepartment: (map['subDepartment'] ?? '') as String,
      teamLead: (map['teamLead'] ?? '') as String,
      timeDuration: (map['timeDuration'] ?? 0) as int,
      description: (map['description'] ?? '') as String,
      userRating: (map['userRating'] ?? 0) as int,
      rejectionRemark: (map['rejectionRemark'] ?? '') as String,
      reviewRemark: (map['reviewRemark'] ?? '') as String,
      solutionRemarks: List<String>.from(map['solutionRemarks'] ?? []),
      createdAt: DateTime.parse((map['createdAt'])),
      status:
          EnumToString.fromString(TicketStatus.values, map['status'].toString())
              as TicketStatus,
      userReviewStatus: EnumToString.fromString(
              UserReviewStatus.values, map['userReviewStatus'].toString())
          as UserReviewStatus,
    );
  }

  String toJson() => json.encode(toMap());

  factory TicketModel.fromJson(String source) =>
      TicketModel.fromMap(json.decode(source) as Map<String, dynamic>);

  @override
  String toString() {
    return 'TicketModel(id: $id, createdBy: $createdBy, userDepartment: $userDepartment, assignTo: $assignTo, againstDepartment: $againstDepartment, hod: $hod, subDepartment: $subDepartment, teamLead: $teamLead, timeDuration: $timeDuration, description: $description,userRating: $userRating,userReviewStatus: $userReviewStatus, rejectionRemark: $rejectionRemark,reviewRemark: $reviewRemark,solutionRemarks: $solutionRemarks, createdAt: $createdAt, status: $status)';
  }

  @override
  bool operator ==(covariant TicketModel other) {
    if (identical(this, other)) return true;

    return other.id == id &&
        other.createdBy == createdBy &&
        other.userDepartment == userDepartment &&
        other.assignTo == assignTo &&
        other.againstDepartment == againstDepartment &&
        other.hod == hod &&
        other.subDepartment == subDepartment &&
        other.teamLead == teamLead &&
        other.timeDuration == timeDuration &&
        other.description == description &&
        other.userRating == userRating &&
        other.userReviewStatus == userReviewStatus &&
        other.rejectionRemark == rejectionRemark &&
        other.reviewRemark == reviewRemark &&
        other.solutionRemarks == solutionRemarks &&
        other.createdAt == createdAt &&
        other.status == status;
  }

  @override
  int get hashCode {
    return hashList([
      id,
      createdBy,
      userDepartment,
      assignTo,
      againstDepartment,
      hod,
      subDepartment,
      teamLead,
      timeDuration,
      description,
      userRating,
      userReviewStatus,
      rejectionRemark,
      reviewRemark,
      solutionRemarks,
      createdAt,
      status,
    ]);
  }
}