import 'dart:convert';
import 'dart:io';

import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:mohem_flutter_app/api/mowadhafhi/mowadhafhi_api_client.dart';
import 'package:mohem_flutter_app/classes/colors.dart';
import 'package:mohem_flutter_app/classes/utils.dart';
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
import 'package:mohem_flutter_app/models/mowadhafhi/get_department_sections.dart';
import 'package:mohem_flutter_app/models/mowadhafhi/get_project_departments.dart';
import 'package:mohem_flutter_app/models/mowadhafhi/get_projects.dart';
import 'package:mohem_flutter_app/models/mowadhafhi/get_section_topics.dart';
import 'package:mohem_flutter_app/models/mowadhafhi/get_ticket_types.dart';
import 'package:mohem_flutter_app/models/mowadhafhi/mowadhafhi_attachement_request.dart';
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
import 'package:mohem_flutter_app/widgets/button/default_button.dart';
import 'package:mohem_flutter_app/widgets/button/simple_button.dart';
import 'package:mohem_flutter_app/widgets/dynamic_forms/dynamic_textfield_widget.dart';
import 'package:mohem_flutter_app/widgets/radio/show_radio.dart';

class MowadhafhiHRRequest extends StatefulWidget {
  const MowadhafhiHRRequest({Key? key}) : super(key: key);

  @override
  _MowadhafhiHRRequestState createState() => _MowadhafhiHRRequestState();
}

class _MowadhafhiHRRequestState extends State<MowadhafhiHRRequest> {
  List<GetTicketTypes> getTicketTypesList = [];
  List<GetMowadhafhiProjects> getMowadhafhiProjectsList = [];
  List<GetProjectDepartments> getProjectDepartmentsList = [];
  List<GetDepartmentSections> getDepartmentSectionsList = [];
  List<GetSectionTopics> getSectionTopicsList = [];

  GetProjectDepartments? selectedDepartment;
  GetDepartmentSections? selectedSection;
  GetSectionTopics? selectedTopic;
  List<File> attachmentFiles = [];

  String selectedServiceType = "";
  String description = "";
  int? projectID;

  @override
  void initState() {
    getTicketTypes();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBarWidget(
        context,
        title: "Mowadhafhi Request",
      ),
      body: SingleChildScrollView(
        child: getTicketTypesList.isNotEmpty
            ? Container(
                width: double.infinity,
                padding: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
                margin: const EdgeInsets.only(left: 12, right: 12, top: 10, bottom: 10),
                decoration: BoxDecoration(
                  color: Colors.white,
                  borderRadius: BorderRadius.circular(10),
                  boxShadow: [
                    BoxShadow(
                      color: const Color(0xff000000).withOpacity(.05),
                      blurRadius: 26,
                      offset: const Offset(0, -3),
                    ),
                  ],
                ),
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    "Service Type: ".toText16(),
                    12.height,
                    Row(
                      mainAxisAlignment: MainAxisAlignment.spaceBetween,
                      children: [
                        SizedBox(
                          height: 40,
                          child: ListView.separated(
                            itemBuilder: (context, index) {
                              return Container(
                                padding: const EdgeInsets.only(right: 6, top: 8, bottom: 8),
                                child: ShowRadio(
                                    title: getTicketTypesList[index].typeName!,
                                    value: getTicketTypesList[index].ticketTypeId!.toString(),
                                    groupValue: selectedServiceType,
                                    selectedColor: MyColors.gradiantStartColor),
                              ).onPress(() {
                                selectedServiceType = getTicketTypesList[index].ticketTypeId!.toString();
                                setState(() {});
                              });
                            },
                            separatorBuilder: (context, index) => 1.width,
                            shrinkWrap: true,
                            itemCount: getTicketTypesList.length ?? 0,
                            scrollDirection: Axis.horizontal,
                          ),
                        ),
                      ],
                    ),
                    12.height,
                    "Department Name: ".toText16(),
                    12.height,
                    PopupMenuButton(
                        child: DynamicTextFieldWidget(
                          "Select Department",
                          selectedDepartment?.departmentName ?? "",
                          isEnable: false,
                          isPopup: true,
                          isInputTypeNum: true,
                          isReadOnly: false,
                        ).paddingOnly(bottom: 12),
                        itemBuilder: (_) => <PopupMenuItem<int>>[
                              for (int i = 0; i < getProjectDepartmentsList!.length; i++) PopupMenuItem<int>(child: Text(getProjectDepartmentsList![i].departmentName!), value: i),
                            ],
                        onSelected: (int popupIndex) {
                          selectedDepartment = getProjectDepartmentsList![popupIndex];
                          getDepartmentSections(selectedDepartment?.projectDepartmentId);
                          setState(() {});
                        }),
                    12.height,
                    "Related Section: ".toText16(),
                    12.height,
                    PopupMenuButton(
                        child: DynamicTextFieldWidget(
                          "Select Section",
                          selectedSection?.sectionName ?? "",
                          isEnable: false,
                          isPopup: true,
                          isInputTypeNum: true,
                          isReadOnly: false,
                        ).paddingOnly(bottom: 12),
                        itemBuilder: (_) => <PopupMenuItem<int>>[
                              for (int i = 0; i < getDepartmentSectionsList!.length; i++) PopupMenuItem<int>(child: Text(getDepartmentSectionsList![i].sectionName!), value: i),
                            ],
                        onSelected: (int popupIndex) {
                          selectedSection = getDepartmentSectionsList![popupIndex];
                          getSectionTopics(selectedSection?.departmentSectionId);
                          setState(() {});
                        }),
                    12.height,
                    "Related Topic: ".toText16(),
                    12.height,
                    PopupMenuButton(
                        child: DynamicTextFieldWidget(
                          "Select Topic",
                          selectedTopic?.topicName ?? "",
                          isEnable: false,
                          isPopup: true,
                          isInputTypeNum: true,
                          isReadOnly: false,
                        ).paddingOnly(bottom: 12),
                        itemBuilder: (_) => <PopupMenuItem<int>>[
                              for (int i = 0; i < getSectionTopicsList!.length; i++) PopupMenuItem<int>(child: Text(getSectionTopicsList![i].topicName!), value: i),
                            ],
                        onSelected: (int popupIndex) {
                          selectedTopic = getSectionTopicsList![popupIndex];
                          // getDepartmentSections(selectedSection?.departmentSectionId);
                          setState(() {});
                        }),
                    12.height,
                    "Supporting Document: ".toText16(),
                    12.height,
                    attachmentView("Attachments"),
                    12.height,
                    "Description: ".toText16(),
                    12.height,
                    DynamicTextFieldWidget(
                      "",
                      "",
                      isEnable: true,
                      isPopup: false,
                      lines: 4,
                      isInputTypeNum: false,
                      isReadOnly: false,
                      onChange: (String value) {
                        debugPrint(value);
                        description = value;
                      },
                    ),
                    50.height
                  ],
                ),
              )
            : Container(),
      ),
      bottomSheet: Container(
        padding: const EdgeInsets.only(top: 8.0, bottom: 8.0),
        decoration: const BoxDecoration(
          color: MyColors.white,
        ),
        child: Row(
          children: [
            12.width,
            Expanded(
              child: DefaultButton(
                "Submit",
                !checkValidation()
                    ? null
                    : () {
                        submitHRRequest();
                      },
                color: const Color(0xFFD02127),
              ),
            ),
            12.width,
          ],
        ),
      ),
    );
  }

  bool checkValidation() {
    if (selectedServiceType == "" || selectedDepartment == null || selectedSection == null || selectedTopic == null) {
      return false;
    } else {
      return true;
    }
  }

  Widget attachmentView(String title) {
    return Container(
      padding: const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14),
      decoration: BoxDecoration(
        color: Colors.white,
        borderRadius: BorderRadius.circular(15),
        boxShadow: [
          BoxShadow(
            color: const Color(0xff000000).withOpacity(.05),
            blurRadius: 26,
            offset: const Offset(0, -3),
          ),
        ],
      ),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        mainAxisSize: MainAxisSize.min,
        children: [
          Row(
            mainAxisSize: MainAxisSize.min,
            crossAxisAlignment: CrossAxisAlignment.center,
            children: [
              title.toText16().expanded,
              6.width,
              SimpleButton("Add", () async {
                FilePickerResult? result = await FilePicker.platform.pickFiles(allowMultiple: true);
                if (result != null) {
                  attachmentFiles = attachmentFiles + result.paths.map((path) => File(path!)).toList();
                  attachmentFiles = attachmentFiles.toSet().toList();
                  setState(() {});
                }
              }, fontSize: 14),
            ],
          ),
          if (attachmentFiles.isNotEmpty) 12.height,
          if (attachmentFiles.isNotEmpty)
            ListView.separated(
                shrinkWrap: true,
                physics: const NeverScrollableScrollPhysics(),
                itemBuilder: (cxt, index) {
                  String fileName = attachmentFiles[index].path.split('/').last;

                  return Row(
                    children: [
                      fileName.toText13().expanded,
                      6.width,
                      IconButton(
                        padding: EdgeInsets.zero,
                        iconSize: 20,
                        icon: const Icon(Icons.cancel_rounded),
                        color: MyColors.redColor,
                        constraints: const BoxConstraints(),
                        onPressed: () async {
                          attachmentFiles.removeAt(index);
                          setState(() {});
                        },
                      )
                    ],
                  );
                },
                separatorBuilder: (cxt, index) => 6.height,
                itemCount: attachmentFiles.length),
        ],
      ),
    );
  }

  void getTicketTypes() async {
    try {
      Utils.showLoading(context);
      getTicketTypesList = await MowadhafhiApiClient().getTicketTypes();
      Utils.hideLoading(context);
      getMowadhafhiProjects();
      // setState(() {});
    } catch (ex) {
      Utils.hideLoading(context);
      Utils.handleException(ex, context, null);
    }
  }

  void getMowadhafhiProjects() async {
    try {
      Utils.showLoading(context);
      getMowadhafhiProjectsList = await MowadhafhiApiClient().getProjects();
      Utils.hideLoading(context);
      getProjectDepartments(getMowadhafhiProjectsList[0].projectId!);
      projectID = getMowadhafhiProjectsList[0].projectId;
    } catch (ex) {
      Utils.hideLoading(context);
      Utils.handleException(ex, context, null);
    }
  }

  void getProjectDepartments(int projectID) async {
    try {
      Utils.showLoading(context);
      getProjectDepartmentsList = await MowadhafhiApiClient().getProjectDepartments(projectID);
      Utils.hideLoading(context);
      setState(() {});
    } catch (ex) {
      Utils.hideLoading(context);
      Utils.handleException(ex, context, null);
    }
  }

  void getDepartmentSections(int? projectDepartmentID) async {
    try {
      Utils.showLoading(context);
      getDepartmentSectionsList = await MowadhafhiApiClient().getDepartmentSections(projectDepartmentID);
      Utils.hideLoading(context);
      setState(() {});
    } catch (ex) {
      Utils.hideLoading(context);
      Utils.handleException(ex, context, null);
    }
  }

  void getSectionTopics(int? departmentSectionID) async {
    try {
      Utils.showLoading(context);
      getSectionTopicsList = await MowadhafhiApiClient().getSectionTopics(departmentSectionID);
      Utils.hideLoading(context);
      setState(() {});
    } catch (ex) {
      Utils.hideLoading(context);
      Utils.handleException(ex, context, null);
    }
  }

  void submitHRRequest() async {
    try {
      Utils.showLoading(context);
      List<Map<String, dynamic>> list = [];
      if (attachmentFiles.isNotEmpty) {
        for (int i = 0; i < attachmentFiles.length; i++) {
          String type = attachmentFiles[i].path.split('.').last;
          String name = attachmentFiles[i].path.split('/').last;
          List<int> fileContent = await attachmentFiles[i].readAsBytes();
          String encodedFile = base64Encode(fileContent);
          list.add(MowadhafhiRequestAttachment(
            contentType: "image/" + type,
            fileName: name,
            base64Data: encodedFile,
          ).toJson());
        }
      }
      int? messageStatus = await MowadhafhiApiClient().submitRequest(selectedDepartment?.projectDepartmentId, description, projectID, selectedSection?.departmentSectionId.toString(),
          selectedTopic?.sectionTopicId.toString(), int.parse(selectedServiceType), list);
      Utils.showToast("Request created successfully");
      Utils.hideLoading(context);
      Navigator.pop(context);
    } catch (ex) {
      Utils.hideLoading(context);
      Utils.handleException(ex, context, null);
    }
  }
}
